📅  最后修改于: 2023-12-03 14:39:59.314000             🧑  作者: Mango
在 C++ 中,静态数据成员是指类中被声明为 static 的数据成员。与普通的数据成员不同,静态数据成员不属于任何一个特定的对象,而是属于该类的所有对象。
静态数据成员的内存分配方式也不同于普通数据成员,在此做一个介绍。
静态数据成员的声明和定义分开进行:
class MyClass {
public:
// 声明静态成员变量
static int m_staticVar;
};
// 定义静态成员变量
int MyClass::m_staticVar = 0;
需要注意的是,在类的定义中,我们只是声明了一个静态数据成员 m_staticVar
,并没有给它分配内存。实际的内存分配要在类外进行。后面的代码则是定义了一个静态的整数变量 m_staticVar
,将其初值赋为 0。
与全局变量类似,静态数据成员的内存分配是在数据段或 bss 段进行的。这也是为什么我们必须在类外对静态数据成员进行定义,否则该静态数据成员就没有分配实际内存。
例如,以下代码将类 MyClass
定义在一个程序中:
#include <iostream>
using namespace std;
class MyClass {
public:
static int m_staticVar;
};
int MyClass::m_staticVar = 0;
int main() {
cout << "Size of MyClass: " << sizeof(MyClass) << endl;
cout << "Address of m_staticVar: " << &MyClass::m_staticVar << endl;
return 0;
}
输出结果为:
Size of MyClass: 1
Address of m_staticVar: 0x1004030c0
可以看到,类的大小为 1(这是因为类中只有静态数据成员而没有非静态数据成员),而 m_staticVar 的地址为 0x1004030c0,是一个全局变量的地址。
由于静态数据成员属于整个类,因此可以使用以下两种方式来访问它们:
MyClass::m_staticVar
,由于属于类,因此不需要实例化类对象即可访问。obj.m_staticVar
,其中 obj
是 MyClass
的一个对象。注意,虽然可以使用类对象访问静态数据成员,但这并不合理,因为它实际上是所有类对象共享的,没有必要通过实例化对象来访问它。