C++ 中的 成员函数 是指定义在 类 的内部的 函数,C++ 中的成员函数支持 函数重载 与 函数默认值。C++ 中的 静态成员函数 是指使用 static 修饰的成员函数。
普通成员函数可以访问所有成员(包括成员变量和成员函数),静态成员函数只能访问 静态成员变量。编译器在编译一个普通成员函数时,会隐式地增加一个形参 this,并把当前对象的地址赋值给 this,所以普通成员函数只能在创建对象后通过对象来调用,因为它需要当前对象的地址。
而静态成员函数可以通过类来直接调用,编译器不会为它增加形参 this,它不需要当前对象的地址,所以不管有没有创建对象,都可以调用静态成员函数。
静态成员函数没有 this 指针,不知道指向哪个对象,无法访问对象的成员变量,也就是说静态成员函数不能访问普通成员变量,只能访问静态成员变量。普通成员函数必须通过对象才能调用,而静态成员函数没有 this 指针,无法在函数体内部访问某个对象,所以不能调用普通成员函数,只能调用静态成员函数。
属性 | 调用方法 |
---|---|
静态成员函数 | C++ 的静态成员函数调用方法有两种,一种是通过 “类名::成员函数名” 的方法,另一种是通过 “对象.成员函数名” 的方法来调用。 |
成员函数 | C++ 的普通成员变量只能通过 “对象.成员函数名” 的方法来调用。 |
属性 | 作用域 |
---|---|
静态成员函数 | 静态成员函数只能访问静态成员变量,不能访问非静态成员变量。 |
成员函数 | 普通成员函数可以访问所有成员,包括静态成员变量和非静态成员变量。 |
静态成员函数只能访问静态成员
#include <iostream>
using namespace std;
class Student
{
public:
Student()
{
}
static void learing()
{
cout << "I am learing " << course << endl;
}
static string course;
};
string Student::course = "C++";
int main()
{
cout << "嗨客网(www.haicoder.net)\n" << endl;
Student stu;
stu.learing();
Student::learing();
return 0;
}
程序运行后,控制台输出如下:
我们创建了一个类 Student,接着,为该类添加了一个静态成员变量 course,和一个静态成员函数 learing。接着,我们创建了一个 Student 类的实例,并通过实例来调用静态成员函数。
同时,在静态成员函数里面,我们访问了静态成员变量,最后,我们发现,在静态成员函数里面可以访问静态成员变量,并且,静态成员函数可以使用对象来调用也可以使用类来调用。现在,我们给类增加一个非静态成员变量,修改程序如下:
#include <iostream>
using namespace std;
class Student
{
public:
Student(string sname)
{
name = sname;
}
static void learing()
{
cout << "I am " << name << " and i am learing " << course << endl;
}
string name;
static string course;
};
string Student::course = "C++";
int main()
{
cout << "嗨客网(www.haicoder.net)\n" << endl;
Student stu("HaiCoder");
stu.learing();
Student::learing();
return 0;
}
程序运行后,控制台输出如下:
这次,我们在静态成员函数里面,调用了非静态成员变量,我们看到,程序报错了,因为在静态成员函数里面只能调用静态成员变量。
非静态成员函数可以访问所有成员变量
#include <iostream>
using namespace std;
class Student
{
public:
Student(string sname)
{
name = sname;
}
void learing()
{
cout << "I am " << name << "and i am learing " << course << endl;
}
string name;
static string course;
};
string Student::course = "C++";
int main()
{
cout << "嗨客网(www.haicoder.net)\n" << endl;
Student stu("HaiCoder");
stu.learing();
return 0;
}
程序运行后,控制台输出如下:
我们可以看到,我们在非静态成员函数里面访问了静态成员变量和非静态成员变量,因此,非静态成员函数可以访问所有的成员变量。现在,我们尝试使用类名直接访问成员函数,修改程序如下:
#include <iostream>
using namespace std;
class Student
{
public:
Student(string sname)
{
name = sname;
}
void learing()
{
cout << "I am " << name << "and i am learing " << course << endl;
}
string name;
static string course;
};
string Student::course = "C++";
int main()
{
cout << "嗨客网(www.haicoder.net)\n" << endl;
Student stu("HaiCoder");
Student::learing();
return 0;
}
程序运行后,控制台输出如下:
这次,我们使用了类名直接访问非静态成员函数,我们看到,程序报错了,因为在非静态成员函数里面只能使用对象来调用。
C++ 的静态成员函数调用方法有两种,一种是通过 “类名::成员函数名” 的方法,另一种是通过 “对象.成员函数名” 的方法来调用。C++ 的普通成员变量只能通过 “对象.成员函数名” 的方法来调用。
普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数)