2

在一个Code::Blocks v13.12项目中,我有一个名为的类Drawable,它有一个名为rotation.

我注意到明确声明rotationinsideDrawable的默认构造函数会触发以下警告:

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

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

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

Drawable() {
    rotation = 0.f;
}

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

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

还有这个:

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

编译没有抱怨?

4

1 回答 1

4

-Weffc ++ 警告描述如下:

警告违反 Scott Meyers 的 Effective C++ 系列书籍中的以下样式指南:

  • 为具有动态分配内存的类定义复制构造函数和赋值运算符。
  • 更喜欢在构造函数中进行初始化而不是赋值。
  • 让 operator= 返回对 *this 的引用。
  • 当你必须返回一个对象时,不要试图返回一个引用。
  • 区分递增和递减运算符的前缀和后缀形式。
  • 永远不要重载 &&、|| 或 ,。

您看到的警告包含在第 4 项中:确保对象在使用Effective C++ 第 3 版之前已初始化,其中说(释义):

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

和:

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

和(强调我的措辞):

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

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

于 2015-01-06T03:32:21.073 回答