1、静态数据成员
静态数据成员其特殊点在于它以关键字static开头。静态数据成员我们也可以叫它共享数据,原因在于一旦我们在一个类中定义了一个或多个静态数据成员,即使我们不创建对象也可以引用这些数据成员。如果只声明了类而没有定义对象,类中的一般数据成员是不占内存空间的。需要注意的是:静态数据成员不属于某一个对象,不会占用某一个对象的内存空间。所有的对象,都可以引用这些静态数据成员。
静态数据成员的生命周期从程序运行开始到主程序运行结束,其所占的内存空从编译被分配,直到程序运行结束才释放。
静态数据成员可以被初始化,而且只能在类外进行初始化。例如:
int Person::name = "Person";
注意不能再初始化参数列表里对静态数据成员进行初始化。
Person(string n):name(n){} //错误,name被定义为静态数据成员
静态数据成员既可以通过对象引用,也可以通过类名来引用。通过类名引用应该加对象名和成员运算符“.”。
2、静态成员函数
成员函数也可以被定义为静态的。一般声明格式:static 数据类型 函数名();
静态成员函数是类的一部分,不是对象的一部分。在类外调用公用静态成员函数,要用类名和域限定符::,静态成员函数是用来处理静态数据成员。
如:Perosn::show();
回顾一般成员函数的调用过程:当调用一个函数的成员函数时,系统会把该对象的起始地址赋给成员函数的this指针,然后执行成员函数。
但是静态成员函数不属于某一个对象,没有this指针,就无法对一个对象中的非静态成员进行默认访问。静态成员函数与非静态成员函数的根本区别在于:非静态成员函数有this指针,而静态成员函数没有this指针。这就决定了静态成员函数不能访问本类中的非静态成员。
静态成员函数可以直接引用本类中的静态数据成员,因为静态数据成员同样属于本类的,可以直接引用。在一个C++程序中,静态成员函数可以访问静态数据成员,但是不可以访问非静态数据成员。