初始化非指针类成员

时间:2012-01-18 23:19:04

标签: c++ constructor initialization stack class-members

最近,我一直在阅读来自广受欢迎的C++ FAQ的构造函数。其中一个条目提到最好使用初始化列表,而不是在构造函数本身的代码块中初始化类成员。

这是因为编译器倾向于创建类成员的多个副本,而不是简单地创建一个副本。

示例

Foo::Foo( void )
    : mBar( new Bar ) //pointer to some memory address
{
}

Foo::Foo( void )
{
    mBar = new Bar;
}

它还指出了一件事(并且,虽然这与构造函数有关,但它也与通常非成员函数的对象的纯初始化有关)是在通过以下方法初始化对象时:

void f( void )
{
    Foo foo( Bar() ); //Bad.

    foo.x(); //error
}

你会,我引用:"[declare] a non-member function that returns a Foo object"

(有关详情,请点击上面的链接)

问题

因此,拥有以下内容是不明智的:

Geometry::Geometry( void )
    : mFaces( QVector< GLushort >() ),
      mFinalized( false ),
      mNormals( QVector< QVector3D >() ),
      mVerticies( QVector< QVector3D >() )

甚至这个:

Geometry::Geometry( void )
    : mFaces( QVector< GLushort > ),
      mFinalized( false ),
      mNormals( QVector< QVector3D > ),
      mVerticies( QVector< QVector3D > )

由于这些被分配的方式(即,这些是非指针的事实),它让我想知道这些对象是否甚至在开始时需要初始化。如果他们这样做,这是正确的方法吗?或者,有更好的初始化方法吗?

这与问题的关系

这与一般性问题有关,因为C ++构造函数初始化背后的方法与使用构造函数初始化对象的方式有关,以及我不知道对象是否在堆栈上分配 - 或者,所以我相信无论如何 - (无论哪种方式,没有指针分配的对象)甚至首先需要初始化。

1 个答案:

答案 0 :(得分:12)

如果成员变量属于具有用户声明的默认构造函数的类类型,则无需在初始化列表中明确提及它:在构造期间,构造函数的主体之前,无论如何都将调用其默认构造函数进入了。

如果成员变量是基本类型(如intbool)或者是没有任何用户声明的构造函数的类类型,则需要显式初始化它,否则它不会被初始化(并且它将具有未知值;您无法读取未初始化的对象)。