构造函数是否应该初始化 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." 但偶尔它会发现一些真正的错误,所以它是完全值得的。
我遇到这样的情况:
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." 但偶尔它会发现一些真正的错误,所以它是完全值得的。