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

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或一些其他编码标准或样式指南.


tou*_*bab 6

C++不要求在构造函数中初始化属性,除非const属性必须在初始化列表中定义值.

但是,初始化构造函数中的每个属性显然是一种很好的做法.我无法计算由于未初始化的变量或属性而遇到的错误数量.

最后,每个对象应永久处于一致状态,包括公共(可访问)属性和私有属性.优化不应成为保持对象不一致的原因.


Ser*_*eyA 5

完全不同意所有的答案和评论。绝对不需要在不需要时默认初始化成员。这就是 C/C++ 从不将内置类型初始化为成员或自动变量的原因——因为这样做会影响性能。当然,当您创建对象/变量一次时这不是问题(这就是静态默认初始化的原因),但是对于在紧密循环中发生的某些事情,默认初始化可能会消耗宝贵的纳秒。

在我看来,这个规则的一个例外是指针(如果你的代码中碰巧有原始指针)。原始指针应该是 NULL 初始化的,因为无效指针是导致未定义行为的直接方式。

  • @SergeyA,什么使指针与其他类型不同?未初始化的数据是未定义的行为。这里和那里。C++ 允许您出于效率原因取消初始化变量,这并不意味着我们必须取消初始化,否则它们会运行得更慢。初始化是一项必要的任务,必须在使用存储的值之前完成(存储意味着初始化),否则你会变得很糟糕。如果您认为整数不如指针重要,只需将其用作数组的索引,您就会拥有一个被覆盖的指针。C++ 也不检查数组边界。 (6认同)
  • *“绝对没有必要在不需要时默认初始化成员。”* - 使创建有时掩盖错误有时不掩盖错误的程序的可能性更大,这在我看来是初始化任何的一个很好的理由成员默认情况下,并且仅在这种优化提供相关性能优势时才保存该初始化。 (2认同)

Jon*_*ham 5

为完整起见,警告来自C/C++代码分析.特别是问题是Potential Programming Problems/Class members should be properly initialized

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

显示警告

至于将CDT与GCC或CLang进行比较,这似乎是CDT与编译器提供的内容相比进行额外代码分析的情况.当然,这是预期的,因为CDT代码分析的范围大于编译器的范围.

PS,如果您愿意,可以阅读此特定检查器的实现.