📜  C++中静态数据成员中的内存分配(1)

📅  最后修改于: 2023-12-03 14:39:59.314000             🧑  作者: Mango

C++中静态数据成员的内存分配

在 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,其中 objMyClass 的一个对象。注意,虽然可以使用类对象访问静态数据成员,但这并不合理,因为它实际上是所有类对象共享的,没有必要通过实例化对象来访问它。
总结
  • 静态数据成员属于整个类,不属于任何一个特定的对象。
  • 静态数据成员的内存分配是在数据段或 bss 段进行的,并且需要在类外进行定义。
  • 静态数据成员的访问可以通过类名和类对象来进行。