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