1. 静态成员变量
在 C++ 中,静态成员变量的声明和定义是有区别的。
声明:在类内部,静态成员变量只是声明,而没有分配内存空间。编译器只知道有这样一个变量的存在,但并没有为其分配实际的内存空间。
class MyClass {
public://它告诉编译器 MyClass 类有一个静态成员变量,但是它并没有分配内存。static int staticVar; // 静态成员变量声明void setStaticVar(int value) {staticVar = value;}static void printStaticVar() {std::cout << "Static Variable: " << staticVar << std::endl;}
};
定义:在类外部,必须显式定义静态成员变量,才能为其分配实际的内存空间。否则,编译器无法分配存储空间,程序会发生链接错误。
// 类外定义静态成员变量,实际上为 staticVar 分配了内存空间。
int MyClass::staticVar = 0;int main() {MyClass obj1, obj2;obj1.setStaticVar(10);obj2.printStaticVar(); // 输出 Static Variable: 10return 0;
}
因此,在头文件中只是声明静态成员变量,不会为其分配实际的内存空间。内存分配是在类外定义静态成员变量时发生的。
2. extern
关键字
extern
关键字用于声明一个变量或函数,它告诉编译器该符号在其他地方定义,并且在当前的文件中不会重新分配存储空间。extern
本身并不会为变量分配内存,而是告诉链接器该变量在其他地方有定义。
-
在头文件中使用
extern
声明变量,表示该变量在其他文件中定义。例如,假设有一个全局变量
globalVar
,它在某个头文件中定义:extern int globalVar; // 仅声明,不分配内存 void printGlobalVar() { std::cout << "Global Variable: " << globalVar << std::endl; }
然后在其他源文件中,声明该变量:
int globalVar = 10; // 变量定义
-
在这个例子中,
extern
声明globalVar
告诉编译器该变量在其他地方定义,但是并没有为其分配内存。实际的内存分配发生在file1.cpp
中的定义处。
总结:
-
静态成员变量的声明:仅在类内部声明静态成员变量时,它只是告诉编译器该成员存在,并没有分配内存。内存分配发生在类外定义时。
-
extern
声明:仅告诉编译器该变量在其他地方定义,并没有为变量分配内存。真正的内存分配发生在其他源文件中对变量的定义处。
因此,在头文件中声明静态成员变量和使用 extern
声明变量时,都只是告诉编译器变量的存在,并不会为其分配实际的存储空间。内存分配只有在变量的定义处发生。