构造函数是否应该初始化 class 的所有数据成员?

Should constructor initialize all the data members of the class?

我遇到这样的情况:

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

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

Member 'm' was not initialized in this constructor

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

Should constructor initialize all the data members of the class?

这将是一个很好的做法。

So, does C++ encourage us to initialize all the data members in the constructor?

c++ 标准不需要它。只要您在使用所有变量之前对其进行初始化,您的程序在这方面就是正确的。

or it is just Eclipse's logic?

很有可能。当启用所有警告时,我测试的 g++ 和 clang 版本都不会对此发出警告。逻辑可能基于也可能不基于 高完整性 c++ 编码标准 12.4.2 或其他一些编码标准或风格指南。

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

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

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

要更改代码分析设置(在这种情况下我建议按项目)编辑项目属性。您可以禁用整个警告,或仅对违反警告条件的文件禁用它。

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

PS,如果你愿意的话,你可以阅读这个particular checker的实现。

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

但是,在构造函数中初始化每个属性显然是一个好习惯。由于未初始化的变量或属性,我无法计算我遇到了多少错误。

最后,每个对象都应该永久处于一致状态,其中包括public(可访问)属性和私有属性也是如此。优化不应成为保持对象不一致的理由。

正如已经说过的,您应该始终初始化指针,当然 const 对象是强制性的。

在我看来,你不应该在没有必要的情况下进行初始化,但最好偶尔检查一下所有非构造函数初始化的变量,因为它们是非常频繁且难以发现错误的来源。

我 运行 每隔几个月检查一次 Cpp。这给了我一百多个 'false' 警告,例如 "Member variable 'foo::bar' is not initialized in the constructor." 但偶尔它会发现一些真正的错误,所以它是完全值得的。