包含类变量初始化的C++类初始化

Phi*_*ent 13 c++ coding-style class

我注意到今天一些同事的代码在初始化中初始化了类变量.然而,由于它们所处的顺序,它引起了警告.我的问题是为什么最好在当前位置进行变量初始化而不是在大括号内?

DiagramScene::DiagramScene( int slideNo, QRectF screenRect, MainWindow* parent )
    : QGraphicsScene( screenRect, parent ),
    myParent( parent ), 
    slideUndoImageCurrentIndex(-1),
    nextGroupID(0),
    m_undoInProgress(false),
    m_deleteItemOnNextUndo(0)
    line(0),
    path(0)
{
    /* Setup default brush for background */
    scDetail->bgBrush.setStyle(Qt::SolidPattern);
    scDetail->bgBrush.setColor(Qt::white);
    setBackgroundBrush(scDetail->bgBrush);

}
Run Code Online (Sandbox Code Playgroud)

Gre*_*ill 26

  • 它更有效(一般而言).无论是否显式初始化类,所有类的成员都在构造函数中初始化.如果未指定初始化,则运行该成员的默认构造函数.如果在构造函数体中指定值,则再次调用赋值运算符.这不适用于标量值,如您的示例所示,因为标量值没有构造函数.
  • 您不能在初始化列表中意外地分配值两次.
  • 编译器可以检查以确保您编写初始化程序的顺序与在类中定义成员的顺序相匹配.C++标准要求成员按声明的顺序进行初始化,而不管您编写初始化程序的顺序如何.让编译器检查此顺序可确保程序员知道初始化程序将在哪个顺序中运行(同样,对于非POD成员而言,这对于标量更重要).
  • const必须在初始化列表中初始化引用类型和成员,因为您无法分配引用或const成员.