Инициализация членов класса, не являющихся указателями

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

8
задан zeboidlund 18 January 2012 в 23:19
поделиться