最近,我从很受欢迎的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>)
由于t hese被分配(即,这些是非指针的事实),这让我怀疑这些对象是否在开始时甚至需要初始化。如果他们这样做,这是否是正确的方法?或者,有没有更好的初始化方法?
如何这涉及到的问题
这涉及到的一般问题,由于背后C++的构造函数初始化的方法使用构造函数,随着事实,我懵了涉及到两个初始化对象的方式无论是否分配在堆栈上的对象 - 或者,所以我相信 - (无论哪种方式,没有指针分配的对象),即使需要初始化。
那么,这是否意味着,根据上面的代码,我只是创建了我分配的对象的多个副本? – zeboidlund 2012-01-18 23:24:44
当你使用mFaces(QVector < GLushort >())''时,你构造一个临时的'QVector',从那个临时对象中拷贝构造'mFaces',然后销毁那个临时对象。所以,是的,你正在创造比必要的更多的物体。 –
2012-01-18 23:27:06