欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > C++静态成员变量与 extern 的内存分配

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

2024/12/22 0:36:53 来源:https://blog.csdn.net/qq_41184334/article/details/144366205  浏览:    关键词: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: 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 声明变量时,都只是告诉编译器变量的存在,并不会为其分配实际的存储空间。内存分配只有在变量的定义处发生。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com