《C++ class类中的static》
在 C++ 中,当类的成员变量被声明为 static 时,它属于类本身,而不是类的某个具体实例(对象)。
因此,static 成员变量需要在类外部进行定义(分配存储空间),否则在链接时会报错(undefined reference)。
为什么需要额外定义?
static成员变量的存储空间:- 非
static成员变量:每个对象独立拥有一份,存储在对象内存布局中。 static成员变量:所有对象共享一份,存储在全局数据区(.data或.bss段),而不是类的内存布局中。- 因此,必须在类外单独定义,以分配存储空间。
- 非
- 声明 vs 定义:
- 声明(在类内部):告诉编译器“这个类有一个
static成员变量”。 - 定义(在类外部):实际分配存储空间(可以初始化)。
- 声明(在类内部):告诉编译器“这个类有一个
demo:
#include <iostream> class MyClass { public: static int count; // 声明 static 成员变量(不分配存储空间) }; // 定义 static 成员变量(分配存储空间,可选初始化) int MyClass::count = 0; int main() { MyClass::count = 42; // 通过类名访问 std::cout << MyClass::count << std::endl; // 输出: 42 return 0; }
关键点
类内仅是声明:static int count; 在类中只是声明,不会分配内存。
类外必须定义:int MyClass::count = 0; 在类外定义,分配内存并可选初始化。如果不定义,链接时会报错:undefined reference to MyClass::count。
初始化规则:static 成员变量必须在类外定义(初始化)。如果是 const static 整型或枚举,可以在类内初始化(C++11 起支持)
class MyClass { public: static const int MAX = 100; // C++11 允许类内初始化 }; // 不需要再在类外定义(除非取地址或需要链接)
常见问题
重复定义错误:如果在头文件中定义 static 成员变量(而非声明),多个源文件包含该头文件会导致重复定义。
// MyClass.h class MyClass { public: static int count; // 声明 }; int MyClass::count = 0; // 定义(应该放在 .cpp 中)
浙公网安备 33010602011771号