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

时间:2015-01-06 03:18:53

标签: c++ initialization effective-c++

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) {}

无怨言地编译?

1 个答案:

答案 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

相关问题