在C++头文件中为类成员变量指定默认初始值是否为不良实践?
类内成员默认初始化写法合理性解答
你提供的头文件代码如下:
// myHeader.hpp class Foo { public: Foo(SomeClassPtr *ptr, std::string text); Foo(std::string text); Foo(); // some code where it is checked that scPtr is not a nullptr ~Foo(); private: SomeClassPtr *scPtr=nullptr; // some other members };
这种在类定义中直接给成员变量设置初始值的写法完全合理,不属于不良编程实践,恰恰是C++11及以后标准推荐的写法之一,具体说明如下:
- 语法完全合法:这个特性叫做「类内成员初始化器」,是C11正式纳入标准的语法,只要你的项目编译环境支持C11及更高版本(目前绝大多数开发场景都已满足这个条件),就不存在语法兼容性问题。
- 完美匹配你的使用场景:
- 消除重复代码:多个构造函数共享的成员初始化逻辑统一放在类内声明处,不需要给每个无
SomeClassPtr参数的构造函数都重复写scPtr(nullptr)的初始化逻辑,既减少冗余,也能避免漏写初始化导致野指针的潜在bug。 - 提升可维护性:成员的默认初始值和声明绑定在一起,后续维护代码时不需要逐个排查各个构造函数的初始化列表,直接看类定义就能明确成员的默认初始状态。
- 不冲突自定义初始化逻辑:类内的默认初始值优先级最低,如果你在带
SomeClassPtr*参数的构造函数的初始化列表中给scPtr赋值,会自动覆盖类内的默认值,完全不会影响自定义的初始化流程。
- 消除重复代码:多个构造函数共享的成员初始化逻辑统一放在类内声明处,不需要给每个无
- 唯一的不适用场景:只有当你的项目需要强制兼容C++03及更早的旧标准时,这个写法才不被支持,这种场景下才需要把
scPtr的初始化逻辑放到每个构造函数的初始化列表中。
内容的提问来源于stack exchange,提问作者GOD is dead
相关产品推荐
相关产品推荐

