C++11类成员初始化相关问题:默认构造函数与构造行为
C++类成员初始化相关问题
以下是一个类的简短示例,其中变量myInteger未在已定义的唯一构造函数中初始化。
// A.h class A { public: A(const std::string& str); private: int myInteger; }; // A.cpp A::A(const string& str) { // 我对str执行一些操作 }
由于已定义了一个构造函数,编译器不会生成无参默认构造函数。
问题1
若修改头文件为变量myInteger设置初始值,编译器是否会生成新的默认构造函数?
修改后的头文件:
// A.h class A { public: A(const std::string& str); private: int myInteger = 3; };
问题2
若修改头文件为变量myInteger设置初始值,编译器是否会修改上述已定义构造函数的行为,使其等同于以下实现?
A::A(const string& str) : myInteger{3} { // 我对str执行一些操作 }
我查阅了《Effective Modern C++》但未找到相关答案,这是一个较为特殊的问题。
问题1解答
不会。编译器生成无参默认构造函数的核心规则是:仅当类中没有任何用户声明的构造函数时才会自动生成。即便给非静态成员变量添加了类内初始值,只要类中存在用户自定义的构造函数(比如这里的A(const std::string& str)),编译器就不会再生成默认构造函数,类内初始值的存在不会改变这一规则。
问题2解答
是的。根据C++11及后续标准,类内成员初始值会作为该成员的默认初始化值——如果构造函数的成员初始化列表中没有显式初始化这个成员,编译器会自动将类内初始值插入到初始化列表中,最终效果完全等同于手动在初始化列表中写myInteger{3}。
需要注意:如果构造函数的成员初始化列表中显式指定了myInteger的初始化值,那么类内初始值会被直接忽略,以初始化列表中的值为准。
内容的提问来源于stack exchange,提问作者user2138149
相关产品推荐
相关产品推荐

