关于C++静态数据成员未触发构造函数及无编译错误的疑问
关于C++静态成员未触发构造的问题解析
你遇到的问题核心在于:类内仅声明的静态成员,若未在类外定义且未被使用,编译器和链接器不会强制实例化它,自然不会调用构造函数。
具体拆解:
静态成员的声明≠定义
C++里类内的static A a;只是一个声明,相当于告诉编译器"有这么个静态成员存在",但并没有为它分配内存、触发构造。必须在类外部补充定义(比如在main函数所在文件的全局区域加一行A B::a;),这个静态对象才会被真正创建,A的构造函数才会执行。为什么没报错?
因为你的代码里完全没用到B::a这个静态成员。根据C++的ODR(单定义规则),只有当一个实体被实际使用时,链接器才会检查它的定义是否存在。如果只是声明但从未使用,系统默认你只是"提了一嘴但不用",所以不会报错,也不会去实例化这个成员。验证一下
要是你在main函数里加一行B::a;(随便用一下这个成员),链接器立刻会报错,提示找不到B::a的定义。这时候补上类外定义,再运行,就会先输出A's Constructor Called,再输出B's Constructor Called。
你的原代码:
#include <iostream> using namespace std; class A { public: A() { cout << "A's Constructor Called " << endl; } }; class B { static A a; public: B() { cout << "B's Constructor Called " << endl; } }; int main() { B b; return 0; }
内容的提问来源于stack exchange,提问作者terto
相关产品推荐
相关产品推荐

