gsa*_*ras 15 c++ eclipse initialization initializer-list language-lawyer
我有这样的情况:
class A {
public:
A() : n(0) {}
private:
int n;
int m;
}
Run Code Online (Sandbox Code Playgroud)
m在构造函数中初始化的应用程序逻辑中没有任何意义.但是,Eclipse警告我构造函数m未初始化.我现在无法在其他地方运行代码.警告是:
成员'm'未在此构造函数中初始化
那么,C++是否鼓励我们初始化构造函数中的所有数据成员,或者它只是Eclipse的逻辑?
eer*_*ika 13
构造函数应该初始化类的所有数据成员吗?
那将是一个很好的做法.
那么,C++是否鼓励我们初始化构造函数中的所有数据成员?
它不是c ++标准所要求的.只要您在使用之前初始化所有变量,您的程序在这方面是正确的.
或者它只是Eclipse的逻辑?
很有可能.当所有警告都启用时,我测试的g ++和clang版本都没有警告.该逻辑可能或可能不是基于高完整性c ++编码标准12.4.2或一些其他编码标准或样式指南.
C++不要求在构造函数中初始化属性,除非const属性必须在初始化列表中定义值.
但是,初始化构造函数中的每个属性显然是一种很好的做法.我无法计算由于未初始化的变量或属性而遇到的错误数量.
最后,每个对象应永久处于一致状态,包括公共(可访问)属性和私有属性.优化不应成为保持对象不一致的原因.
完全不同意所有的答案和评论。绝对不需要在不需要时默认初始化成员。这就是 C/C++ 从不将内置类型初始化为成员或自动变量的原因——因为这样做会影响性能。当然,当您创建对象/变量一次时这不是问题(这就是静态默认初始化的原因),但是对于在紧密循环中发生的某些事情,默认初始化可能会消耗宝贵的纳秒。
在我看来,这个规则的一个例外是指针(如果你的代码中碰巧有原始指针)。原始指针应该是 NULL 初始化的,因为无效指针是导致未定义行为的直接方式。