В последнее время я много читал о конструкторах из хорошо принятого 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 ++Инициализация относится как к инициализации объектов с использованием функций конструктора, так и к тому, что я не знаю, размещены ли объекты в стеке - или, как мне кажется, в любом случае - (в любом случае, объекты без выделения указателей), даже need инициализация на первом месте.