ポインター以外のクラスメンバーの初期化
-
30-10-2019 - |
質問
最近、私は好評からコンストラクターについて多くを読んできました C ++ FAQ. 。エントリの1つは、コンストラクター自体のコードブロック内のクラスメンバーを初期化するのではなく、初期化リストを使用することが常に最適であると述べています。
これは、コンパイラが単に1つのコピーではなく、クラスメンバーの複数のコピーを作成する傾向があるためです。
例
良い
Foo::Foo( void )
: mBar( new Bar ) //pointer to some memory address
{
}
悪い
Foo::Foo( void )
{
mBar = new Bar;
}
また、それが述べていることの1つ(そして、これはコンストラクターに関連していますが、以下のようなメソッドを介してオブジェクトを初期化するときに、一般的なオブジェクトの純粋な初期化にも関連しています)は次のとおりです。
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 ++コンストラクターの初期化の背後にある方法論がコンストラクター関数を使用してオブジェクトを初期化する両方の初期化に関連している方法と、スタックに割り当てられたオブジェクトが割り当てられているかどうかに無知であるという事実に関連して、一般的な質問に関連しています。 - (いずれにしても、ポインター割り当てのないオブジェクト) 必要 そもそも初期化。
正しい解決策はありません