构造函数应该初始化类的所有数据成员吗?

时间:2015-10-14 11:52:27

标签: c++ eclipse initialization language-lawyer initializer-list

我有这样的情况:

class A {
public:
  A() : n(0) {}
private:
  int n;
  int m;
}

在构造函数中初始化m的应用程序逻辑中没有任何意义。但是,Eclipse警告我构造函数保留m未初始化。我现在无法在其他地方运行代码。警告是:

  

成员'm'未在此构造函数中初始化

那么,C ++是否鼓励我们初始化构造函数中的所有数据成员,或者它只是Eclipse的逻辑?

5 个答案:

答案 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

要更改代码分析设置(在本例中我建议按项目),请编辑项目属性。您可以禁用整个警告,或仅在违反警告条件的文件上禁用它。

show the warning

至于将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'未在构造函数中初始化。"但有一段时间它会发现一些真正的错误,所以它是完全值得的。