gpt4 book ai didi

c++ - 初始化非指针类成员

转载 作者:可可西里 更新时间:2023-11-01 17:35:43 24 4
gpt4 key购买 nike

最近,我从广受欢迎的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
}

你会的,我引用:[声明]一个返回 Foo 对象的非成员函数”

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

问题

正因为如此,有以下几点是不是很不明智:

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

最佳答案

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

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

关于c++ - 初始化非指针类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8918978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com