Инициализация не указателей членов класса - PullRequest
8 голосов
/ 19 января 2012

В последнее время я много читал о конструкторах из хорошо принятого 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 инициализация на первом месте.

1 Ответ

13 голосов
/ 19 января 2012

Если переменная-член имеет тип класса с объявленным пользователем конструктором по умолчанию, вам не нужно явно упоминать его в списке инициализации: его конструктор по умолчанию будет вызываться в любом случае, во время конструирования, перед телом конструктора введен.

Если переменная-член имеет примитивный тип (например, int или bool) или имеет тип класса, который не имеет каких-либо объявленных пользователем конструкторов, его необходимо инициализировать явно, иначе он не будет инициализирован (и он будет иметь неизвестное значение; вы не можете прочитать неинициализированный объект).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...