关于C++类成员变量非成员函数内初始化的时机与实现疑问
关于C++类成员初始化的问题解答
先贴出你提供的可正常运行的代码:
class test { public: int x = 0; int y = 23; void printValues() { std::cout << x <<" and then: "<< y<< std::endl; } };
问题1:变量初始化的阶段
不管是你代码里的类内成员初始化(C++11及以后支持),还是常见的构造函数初始化列表、构造函数体内赋值,所有成员的初始化都属于对象构造阶段。
当创建test类的对象时,哪怕是用编译器生成的空默认构造函数,初始化流程是固定的:
- 先执行基类的构造逻辑(如果有基类)
- 接着严格按照类中成员声明的顺序,依次完成成员初始化:
- 有类内初始值的成员,直接用该值初始化;
- 构造函数初始化列表里指定了值的,用列表里的值;
- 都没指定的话,执行默认初始化(比如int类型会留随机值,但你这里有类内初始化不会出现这种情况)
- 最后才会执行构造函数的函数体代码(如果构造函数有内容的话)
哪怕构造函数是空的,类内成员的初始化也会在构造函数体执行前完成,属于对象创建的早期步骤。
问题2:编译器如何处理类内成员初始化
编译器在编译阶段就会识别到int x = 0;这类类内初始化语句,它会自动把这些初始化逻辑合并到类的所有构造函数中——包括编译器自动生成的默认构造函数。
当你实例化test对象时:
- 编译器先为对象分配内存;
- 按照成员声明的顺序,把你指定的初始值(0给x,23给y)写入对应内存位置——这个操作和构造函数调用同步进行,是构造过程的一部分,而且会在构造函数体执行前完成;
- 如果构造函数有函数体代码,这时候才会执行里面的内容。
说白了,类内初始化就是编译器帮你把初始化逻辑自动加到了每个构造函数的初始化列表里(只要构造函数没显式在列表里指定该成员的初始化),所以创建对象时会自动完成赋值,不用你手动在构造函数里写。
内容的提问来源于stack exchange,提问作者George kirby
相关产品推荐
相关产品推荐

