静态成员

定义数据成员为静态变量,表明此全局数据逻辑上属于该类。
定义成员函数为静态函数,表明此全局函数逻辑上属于该类,而且该函数只对静态数据、全局数据或者参数进行操作,而不对非静态数据成员进行操作。

静态数据成员

静态数据成员在定义或说明时前面加关键字static,如:

class A
{
    int n;
    static int s;
};

sizeof 运算符不会计算静态成员变量,sizeof(CMyclass)等于4。使用静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。

静态数据成员是静态存储的,它是静态生存期,必须对它进行初始化。
静态成员初始化与一般数据成员初始化不同,类数据成员在类内部声明,但是静态成员必须在类的外面初始化,静态数据成员初始化的格式如下:
<数据类型><类名>::<静态数据成员名>=<值>

如果一个类中说明了静态数据成员,只有在这个类的第一个对象被创建时被初始化,自第二个对象起均不作初始化。对A类中静态数据成员s进行初始化:
int A::s = 0;
初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆。
static int A::s = 0; // error C2720: “A::s”: 成员上的“static ”存储类说明符非法

引用静态数据成员时,采用如下格式:
<类名>::<静态成员名>

静态数据成员被类的所有对象所共享,包括该类派生类的对象。即派生类对象与基类对象共享基类的静态数据成员。

静态成员函数

静态函数仅可以访问静态成员,或是静态成员函数或是静态数据成员。

因为静态成员函数属于整个类,在类实例化之前就已经分配空间了,而类的非静态成员必须在类的实例化对象之前才能有内存空间,所以类的静态成员访问非静态成员就会出错,就好像没有声明一个变量却提前使用它一样。但类的非静态成员函数却可以调用静态成员函数。

调用静态成员函数使用如下格式:
<类名>::<静态成员函数名>(<参数表>)

和非静态成员函数一样,静态成员函数可以在派生类中被重定义,派生类会隐藏基类同名的函数。但静态成员函数不能为virtual函数,这是因为virtual函数由编译器提供了this指针,而static是没有this指针的。

此外,可通过类的对象来访问静态数据成员和静态成员函数

参考
https://www.cnblogs.com/wkfvawl/p/10834549.html#navigator

posted @ 2020-07-08 12:30  hunter-w  阅读(425)  评论(0编辑  收藏  举报