2012-01-18 10 views
8

最近、よく受信されたコンストラクタについて多くのことを読んできました。C++ FAQ。エントリの1つは、コンストラクタ自体のコードブロック内でクラスメンバを初期化するのではなく、初期化リストを使用することが常にベストであることを述べています。非ポインタクラスメンバの初期化

これは、コンパイラが単純に1つのコピーではなく、クラスメンバーの複数のコピーを作成する傾向があるためです。

良い例

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"をしても非メンバ関数からl)は次のような方法でオブジェクトを初期化するときにということです。

あるいはこの:

次持つように

質問このための

、それは賢明ではありません(詳細は、上記のリンクをクリックしてください)

Geometry::Geometry(void) 
    : mFaces(QVector<GLushort>), 
     mFinalized(false), 
     mNormals(QVector<QVector3D>), 
     mVerticies(QVector<QVector3D>) 

t (すなわち、これらが非ポインタであるという事実)、これらのオブジェクトが初めに初期化を必要とするかどうか疑問に思う。もしそうなら、これは正しい方法でしょうか?または、より良い初期化メソッドがありますか?この質問

これが原因C++コンストラクタの初期化の背後にある方法論は、私が無知だという事実とともに、コンストラクタ関数を使用して初期化オブジェクトの両方に関係する方法に一般的な質問に関連するとどのように関連するか

スタックに割り当てられたオブジェクトか、とにかく私が信じるかどうかにかかわらず、(どちらの方法でも、ポインタ割り当てのないオブジェクト)でもは最初にの初期化が必要です。

答えて

12

メンバ変数が、ユーザが宣言したデフォルトのコンストラクタを持つクラス型である場合、初期化リストに明示的に言及する必要はありません。デフォルトのコンストラクタは、とにかく呼び出されます。コンストラクタに入ります。

メンバ変数は、(intまたはboolなど)プリミティブ型であるか、任意のユーザ宣言したコンストラクタを持たないクラス型である場合は、明示的に初期化する必要があり、それ以外の場合は初期化されません(と未知の値を持ち、初期化されていないオブジェクトを読み取ることはできません)。

+0

これは、上記のコードによれば、私が割り当てているオブジェクトの複数のコピーを作成しているということですか? – zeboidlund

+3

'mFaces(QVector < GLushort >())'を使うと一時的な 'QVector 'を構築し、その一時的なオブジェクトから 'mFaces'をコピーして、その一時的なオブジェクトを破壊します。ですから、必要以上に多くのオブジェクトを作成しています。 –