最近,我一直在阅读来自广受欢迎的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 ++构造函数初始化背后的方法与使用构造函数初始化对象的方式有关,以及我不知道对象是否在堆栈上分配 - 或者,所以我相信无论如何 - (无论哪种方式,没有指针分配的对象)甚至首先需要初始化。
答案 0 :(得分:12)
如果成员变量属于具有用户声明的默认构造函数的类类型,则无需在初始化列表中明确提及它:在构造期间,构造函数的主体之前,无论如何都将调用其默认构造函数进入了。
如果成员变量是基本类型(如int
或bool
)或者是没有任何用户声明的构造函数的类类型,则需要显式初始化它,否则它不会被初始化(并且它将具有未知值;您无法读取未初始化的对象)。