C++ 显式声明会在默认构造函数中触发警告

C++ Explicit declaration triggers a warning in the default constructor

本文关键字:构造函数 警告 默认 声明 C++      更新时间:2023-10-16

Code::Blocks v13.12项目中,我有一个名为Drawable的类,它有一个名为rotation的浮点成员变量。

我注意到在Drawable的默认构造函数中显式声明rotation会触发以下警告:

'Drawable::rotation' 应该在成员初始化列表中初始化 [-Weffc++]

但是,在其定义旁边显式声明rotation并不能做到这一点。

我想知道的是,为什么这样做:

Drawable() {
    rotation = 0.f;
}

给我一个成员初始化警告,而这个:

class Drawable
{
    ...
    float rotation = 0.f;
    ...
}

而这个:

Drawable() : rotation(0.f) {}

毫无怨言地编译?

-Weffc++ 警告描述如下:

警告违反 Scott 的以下样式准则 迈耶斯的有效C++系列书籍:

  • 为具有动态分配内存的类定义复制构造函数和赋值运算符。
  • 首选初始化而不是构造函数中的赋值。
  • 让运算符 = 返回对 *this 的引用。
  • 当必须返回对象时,不要尝试返回引用。
  • 区分递增运算符和递减运算符的前缀和后缀形式。
  • 切勿重载 &&、||或 ,。

您看到的警告在第 4 项中介绍:确保对象在初始化之前它们用于有效C++第 3 版,其中说(释义):

C++规则规定对象的数据成员是 在输入构造函数的主体之前初始化。

和:

编写 [...] 构造函数的更好方法是使用成员 初始化列表而不是赋值 [...] 构造函数产生 相同的最终结果[...],但它通常会更有效率。

和(强调我的措辞):

基于赋值的版本首先将默认构造函数称为 初始化成员变量,然后及时分配 默认构造值之上的新值。所有的工作 因此,在这些默认结构中执行的被浪费了。这 成员初始化列表方法避免了这个问题,

在类的 C++11 中,成员初始值设定项(也可以避免此警告)可以简化初始化,如果大多数成员变量都有默认值,一个缺点是直到 C++14 这使您的类成为非聚合。