2012-01-18 57 views
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>) 

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

如何这涉及到的问题

这涉及到的一般问题,由于背后C++的构造函数初始化的方法使用构造函数,随着事实,我懵了涉及到两个初始化对象的方式无论是否分配在堆栈上的对象 - 或者,所以我相信 - (无论哪种方式,没有指针分配的对象),即使需要初始化。

回答

12

如果成员变量是具有用户声明的默认构造函数的类类型,则不需要在初始化列表中明确地提及它:其构造函数的默认构造函数将在构造过程中,在构造函数构造函数被输入。

如果成员变量是一个基本类型(如intbool),或者是不具有任何用户声明的构造函数的类类型的,你需要明确地初始化它,否则它不会被初始化(和它将有一个未知的值;你不能读未初始化的对象)。

+0

那么,这是否意味着,根据上面的代码,我只是创建了我分配的对象的多个副本? – zeboidlund 2012-01-18 23:24:44

+3

当你使用mFaces(QVector < GLushort >())''时,你构造一个临时的'QVector ',从那个临时对象中拷贝构造'mFaces',然后销毁那个临时对象。所以,是的,你正在创造比必要的更多的物体。 – 2012-01-18 23:27:06