zeb*_*und 8 c++ stack constructor initialization class-members
最近,我一直在阅读来自广受欢迎的C++ FAQ的构造函数.其中一个条目提到最好使用初始化列表,而不是在构造函数本身的代码块中初始化类成员.
这是因为编译器倾向于创建类成员的多个副本,而不是简单地创建一个副本.
例
好
Foo::Foo( void )
: mBar( new Bar ) //pointer to some memory address
{
}
Run Code Online (Sandbox Code Playgroud)
坏
Foo::Foo( void )
{
mBar = new Bar;
}
Run Code Online (Sandbox Code Playgroud)
它还指出了一件事(并且,虽然这与构造函数有关,但它也与通常非成员函数的对象的纯初始化有关)是在通过如下方法初始化对象时:
void f( void )
{
Foo foo( Bar() ); //Bad.
foo.x(); //error
}
Run Code Online (Sandbox Code Playgroud)
你会,我引用:"[declare] a non-member function that returns a Foo object".
(有关详细信息,请单击上面的链接)
问题
因此,拥有以下内容是不明智的:
Geometry::Geometry( void )
: mFaces( QVector< GLushort >() ),
mFinalized( false ),
mNormals( QVector< QVector3D >() ),
mVerticies( QVector< QVector3D >() )
Run Code Online (Sandbox Code Playgroud)
甚至这个:
Geometry::Geometry( void )
: mFaces( QVector< GLushort > ),
mFinalized( false ),
mNormals( QVector< QVector3D > ),
mVerticies( QVector< QVector3D > )
Run Code Online (Sandbox Code Playgroud)
由于这些被分配的方式(即,这些是非指针的事实),它让我想知道这些对象是否甚至在开始时需要初始化.如果他们这样做,这是正确的方法吗?或者,有更好的初始化方法吗?
这与问题有何关系
这与一般性问题有关,因为C++构造函数初始化背后的方法与使用构造函数初始化对象的方式有关,以及我不知道对象是否在堆栈上分配 - 或者,我相信无论如何- (无论哪种方式,没有指针分配的对象)甚至需要首先进行初始化.
Jam*_*lis 13
如果成员变量是具有用户声明的默认构造函数的类类型,则无需在初始化列表中明确提及它:在构造期间,在输入构造函数的主体之前,将始终调用其默认构造函数.
如果成员变量是基本类型(如int或bool)或者是没有任何用户声明的构造函数的类类型,则需要显式初始化它,否则它将不会被初始化(并且它将具有未知值;你无法读取未初始化的对象).