我有这样的情况:
class A {
public:
A() : n(0) {}
private:
int n;
int m;
}
在构造函数中初始化m
的应用程序逻辑中没有任何意义。但是,Eclipse警告我构造函数保留m
未初始化。我现在无法在其他地方运行代码。警告是:
成员'm'未在此构造函数中初始化
那么,C ++是否鼓励我们初始化构造函数中的所有数据成员,或者它只是Eclipse的逻辑?
答案 0 :(得分:12)
构造函数应该初始化类的所有数据成员吗?
这将是一个很好的做法。
那么,C ++是否鼓励我们初始化构造函数中的所有数据成员?
c ++标准不要求它。只要您在使用之前初始化所有变量,您的程序在这方面是正确的。
或者它只是Eclipse的逻辑?
很可能。当所有警告都启用时,我测试的g ++和clang版本都没有警告。逻辑可能基于high integrity c++ coding standard 12.4.2或其他编码标准或样式指南,也可能不基于。
答案 1 :(得分:5)
为完整起见,警告来自C / C ++代码分析。特别是问题是Potential Programming Problems
/ Class members should be properly initialized
要更改代码分析设置(在本例中我建议按项目),请编辑项目属性。您可以禁用整个警告,或仅在违反警告条件的文件上禁用它。
至于将CDT与GCC或CLang进行比较,这似乎是CDT与编译器提供的内容相比进行额外代码分析的情况。当然,这是预期的,因为CDT Code Analysis的职权范围大于编译器的职权范围。
PS,如果您愿意,可以阅读此particular checker的实现。
答案 2 :(得分:5)
C ++不要求在构造函数中初始化属性,除非const属性必须在初始化列表中定义值。
但是,初始化构造函数中的每个属性显然是一个好习惯。我无法计算由于未初始化的变量或属性而遇到的错误数量。
最后,每个对象都应永久处于一致状态,其中包括公共(可访问)属性和私有属性。优化不应成为保持对象不一致的原因。
答案 3 :(得分:1)
完全不同意所有答案和评论。在不需要时,绝对不需要默认初始化成员。这就是为什么C / C ++永远不会将内置类型初始化为成员或自动变量的原因 - 因为这样做会妨碍性能。当然,在创建一次对象/变量时(这是静态初始化静态的原因)不是问题,但是对于在紧密循环中发生的事情,默认初始化可能会耗费宝贵的纳秒。
在我看来,这个规则的一个例外是指针(如果你的代码中碰巧有原始指针)。原始指针应该是NULL初始化的,因为具有无效指针是未定义行为的直接方式。
答案 4 :(得分:0)
正如已经说过的那样,你应该总是初始化指针,当然const对象是强制性的。
在我看来,你不应该在没有必要的时候进行初始化,但偶尔检查所有非构造函数的初始化变量是好的,因为它们是非常频繁且难以发现的错误的来源。
我每隔几个月就会跑一次Cppcheck。这给了我一百多个假的'像"会员变量' foo :: bar'未在构造函数中初始化。"但有一段时间它会发现一些真正的错误,所以它是完全值得的。