在Code::Blocks v13.12
项目中,我有一个名为Drawable
的类,它有一个名为rotation
的浮点成员变量。
我注意到在rotation
的默认构造函数中明确声明Drawable
会触发以下警告:
'Drawable :: rotation'应该在成员初始化列表[-Weffc ++]
中初始化
但是,明确声明rotation
及其定义并不会这样做。
我想知道的是,为什么会这样:
Drawable() {
rotation = 0.f;
}
给我一个成员初始化警告,同时:
class Drawable
{
...
float rotation = 0.f;
...
}
而且:
Drawable() : rotation(0.f) {}
无怨言地编译?
答案 0 :(得分:4)
-Weffc++ warning描述如下:
警告Scott违反以下风格指南 Meyers的Effective C ++系列丛书:
- 为具有动态分配内存的类定义复制构造函数和赋值运算符。
- 首选初始化为构造函数中的赋值。
- 让operator =返回对* this的引用。
- 当您必须返回对象时,请勿尝试返回引用。
- 区分增量和减量运算符的前缀和后缀形式。
- 绝不过载&&,||或,。
第4项中介绍了您所看到的警告:确保之前已初始化对象 他们使用了Effective C++ 3rd edition的(释义):
C ++规则规定了对象的数据成员 在输入构造函数体之前初始化。
和
编写[...]构造函数的更好方法是使用该成员 初始化列表而不是赋值[...]构造函数的产生 相同的最终结果[...]但通常会更有效率。
和(强调我的措辞):
基于赋值的版本首先调用默认构造函数 初始化成员变量然后立即分配 在默认构造的值之上的新值。所有的工作 因此浪费了在那些默认结构中执行的操作。该 成员初始化列表方法避免了这个问题,
在C ++ 11中in class member initializers(也避免了这个警告)可以简化初始化,如果你的大多数成员变量都有默认值,一个缺点是直到C ++ 14这make your class a non-aggregate。