C++ 初始化非指针类成员

C++ 初始化非指针类成员,c++,constructor,initialization,stack,class-members,C++,Constructor,Initialization,Stack,Class Members,最近,我从广受欢迎的网站上读到了很多关于构造函数的文章。其中一条提到最好使用初始化列表,而不是在构造函数本身的代码块中初始化类成员 这是因为编译器倾向于创建类成员的多个副本,而不仅仅是一个副本 示例 好 坏的 它还声明了一件事(虽然这与构造函数有关,但也与通常从非成员函数对对象进行的纯初始化有关),即当通过以下方法初始化对象时: void f( void ) { Foo foo( Bar() ); //Bad. foo.x(); //error } Geometry::Geo

最近,我从广受欢迎的网站上读到了很多关于构造函数的文章。其中一条提到最好使用初始化列表,而不是在构造函数本身的代码块中初始化类成员

这是因为编译器倾向于创建类成员的多个副本,而不仅仅是一个副本

示例

坏的

它还声明了一件事(虽然这与构造函数有关,但也与通常从非成员函数对对象进行的纯初始化有关),即当通过以下方法初始化对象时:

void f( void )
{
    Foo foo( Bar() ); //Bad.

    foo.x(); //error
}
Geometry::Geometry( void )
    : mFaces( QVector< GLushort >() ),
      mFinalized( false ),
      mNormals( QVector< QVector3D >() ),
      mVerticies( QVector< QVector3D >() )
您将,我引用:
“[声明]一个返回Foo对象的非成员函数”

(有关更多信息,请单击上面的链接)

问题

因此,有以下情况是不明智的:

void f( void )
{
    Foo foo( Bar() ); //Bad.

    foo.x(); //error
}
Geometry::Geometry( void )
    : mFaces( QVector< GLushort >() ),
      mFinalized( false ),
      mNormals( QVector< QVector3D >() ),
      mVerticies( QVector< QVector3D >() )
Geometry::Geometry(void)
:mFaces(QVector()),
最终化(错误),
mNormals(QVector()),
垂直度(QVector())
甚至这个:

Geometry::Geometry( void )
    : mFaces( QVector< GLushort > ),
      mFinalized( false ),
      mNormals( QVector< QVector3D > ),
      mVerticies( QVector< QVector3D > )
Geometry::Geometry(void)
:mFaces(QVector),
最终化(错误),
mNormals(QVector),
垂直度(QVector
由于分配这些对象的方式(即,这些对象是非指针的事实),这让我想知道这些对象在开始时是否需要初始化。如果他们这样做了,这是正确的方法吗?或者,有更好的初始化方法吗

这与问题的关系如何


<>这涉及到一般问题,因为C++构造函数初始化的方法既涉及使用构造函数初始化对象,也与我对栈上分配的对象是否无知无关,或者,无论如何,我相信(不管是哪种方式,没有指针分配的对象)即使首先也需要初始化。

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


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

那么,这是否意味着,根据上面的代码,我只是在创建分配对象的多个副本?当您使用
mFaces(QVector())
时,您构建一个临时
QVector
,从该临时对象复制
mFaces
,然后销毁该临时对象。因此,是的,您创建的对象比需要的多。