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