自学内容网 自学内容网

C++静态成员变量与 extern 的内存分配

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: 10
    return 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 声明变量时,都只是告诉编译器变量的存在,并不会为其分配实际的存储空间。内存分配只有在变量的定义处发生。


原文地址:https://blog.csdn.net/qq_41184334/article/details/144366205

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!