为何需声明static vector?类静态vector定义相关技术疑问
关于C++静态vector成员变量的定义问题
这是个非常典型的C++静态成员变量的常见困惑,我来给你一步步解释清楚:
1. cpp文件中那句代码的核心作用
你在类里写的:
static vector<Player> PLAYERS;
这只是静态成员变量的声明——它仅仅告诉编译器:“这个Foo类有一个名为PLAYERS的静态vector成员”,但并没有在内存中为它分配空间,也没有完成初始化。
而cpp文件里的这句:
vector<Player> Foo::PLAYERS;
才是静态成员变量的定义:它会在程序的全局内存区域为PLAYERS分配实际的存储空间,同时调用vector的默认构造函数完成初始化。链接器在编译链接阶段,就是靠这个定义来找到这个静态变量的实际位置,否则就会抛出“未定义引用”的错误。
简单说:声明是“告诉编译器有这个东西”,定义是“把这个东西真正造出来”。
2. 它和类的构造函数有什么区别?
完全不是一回事:
- 构造函数是用来初始化类的实例对象的:每次你创建
Foo的一个对象(比如Foo f;或者new Foo;),构造函数都会被调用,负责初始化这个实例里的非静态成员。 - 静态成员的定义是用来初始化类共享的静态变量的:这个操作整个程序生命周期里只会执行一次,和你创建多少个
Foo实例完全无关——因为静态成员是属于整个类的,不是属于某个对象的。
3. 如果vector是非静态成员,还需要这样的声明吗?
不需要!
非静态成员是属于每个类实例的,它们的内存空间会在你创建Foo对象的时候,跟着对象一起分配在栈或者堆上。这些成员的初始化是由类的构造函数负责的,不需要在cpp文件里单独定义——每个Foo对象都会有自己的一份非静态vector,彼此独立。
内容的提问来源于stack exchange,提问作者Default99
相关产品推荐
相关产品推荐

