【问题标题】:Initializing Non-pointer Class Members初始化非指针类成员
【发布时间】:2012-02-13 16:39:56
【问题描述】:

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

【问题讨论】:

    标签: c++ constructor initialization stack class-members


    【解决方案1】:

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

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

    【讨论】:

    • 那么,这是否意味着,根据上面的代码,我只是创建了我正在分配的对象的多个副本?
    • 当你使用mFaces( QVector&lt; GLushort &gt;() )时,你构造一个临时的QVector&lt;GLushort&gt;,从那个临时对象复制构造mFaces,然后销毁那个临时对象。所以,是的,你创建的对象比需要的多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多