初始化非指针类成员

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

如果成员变量是具有用户声明的默认构造函数的类类型,则无需在初始化列表中明确提及它:在构造期间,在输入构造函数的主体之前,将始终调用其默认构造函数.

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

  • 当你使用`mFaces(QVector <GLushort>())`时,你构造一个临时的`QVector <GLushort>`,从那个临时对象复制构造`mFaces`,然后销毁那个临时对象.所以,是的,您创建的对象超出了必要的范围. (3认同)