8

最近,我从广受好评的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++ 构造函数初始化背后的方法与使用构造函数初始化对象有关的方式,以及我不知道对象是否在堆栈上分配的事实 - 或者,所以我相信无论如何- (无论哪种方式,没有指针分配的对象)甚至首先需要初始化。

4

1 回答 1

13

如果成员变量是具有用户声明的默认构造函数的类类型,则无需在初始化列表中显式提及它:在构造过程中,在进入构造函数的主体之前,无论如何都会调用其默认构造函数。

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

于 2012-01-18T23:22:59.343 回答