2011-01-07 20 views
1

コーディングスタイル++、Cについてだけで簡単な質問、例えばクラス初期化リスト

は、クラスのすべてのメンバ変数を初期化リスト内のデフォルトコンストラクタで呼び出されます。 Bのデフォルトのコンストラクタが呼び出され、valueは0、int()に設定されます。私の質問は、さえデフォルトコンストラクタが呼び出されるかされしかし

class A 
{ 
    A(); 
private: 
    B b; 
    int value; 
} 

は、それ自身またはそれがコードのみ

A :: Aに余分な行を追加しないと、常にを行うには良い習慣です():b()、value(){}

+0

あなたはどのような意味ですか? – Eilidh

+0

A :: A(){}を空にしても入力することをお勧めしますか? – Eilidh

+0

もしあなたが書いていないのであれば:b()、value()、コンパイルはあなたのためにそれを行い、コンストラクタに与える引数を持っているときや、例えば0以外の値をintに変換する – hidayat

答えて

2

デフォルトコンストラクタをそのままにしておくことをお勧めします。コンパイラで生成されたコンストラクタは、独自のバージョンを作成するよりもはるかに信頼性が高くメンテナンス性が高く、他のものとは別に、コンパイラが書くことのできる時間を無駄にすることはありません。構築ロジックが必要ない場合は、コンストラクタを記述しないでください。

ただし、intは初期化されない限り初期化されません。これはコンストラクタを書く必要があるためです。

+0

(+1)を確認します。クラス内の属性の順序を変更すると、リストのリファクタリング(初期化順序を表す)にもなります。 –

+0

ほとんどの場合私は同意します。しかし、クラスにPODメンバーが含まれている場合は、オブジェクトが構築後に定義された状態にあることを確認するために、明示的なコンストラクタを追加します。クラスが本当に単なるオブジェクトバッグ(上記のようなもの)でない場合は、その事実を反映する構造体にします。 –

+0

@Raphael B:ほとんどのコンパイラはこれについて警告します(そして私はいつもエラーとして扱われる警告でコンパイルします)ので、あなたが変更を見落とさないようにします。 –

1

デフォルトでは、int変数は値で初期化されません。

したがって、メンバ変数 "value"をコンストラクタの値に設定しないと、初期化されません。

1

デフォルトのコンストラクタは、プリミティブではなく、デフォルトのコンストラクタを持つクラス型に対してのみ呼び出されます。

4

C++のスティッキーコーナーの1つに触れています。

オブジェクト内のPOD値の初期化は粘着性があり、いくつかの事柄によって異なります。
でも、私はすべてのルールを正しいものにすることができるかどうかはわかりませんが、@ Steve Jessopはかつてここに記事を書いていました(私は現在見つけることができますが)。

しかし、いくつかの例:

このクラスは、常にそれがより複雑である明示デフォルトコンストラクタがなければB == falseの値= 0

class A 
{ 
    A() : b(), value() {} 
    B b; 
    int value; 
}; 

初期化されます。
ここで、コンパイラはデフォルトコンストラクタを生成します。しかし、コンパイラがどのようにデフォルトコンストラクタを生成したかは状況によって異なります。コンパイラ生成されるデフォルトのコンストラクタは、初期化の2つの異なる形式を行うことができますし、文脈に依存して使用されている:

  1. ゼロ初期化(すべてのPODのメンバーが出zero'edされている)
  2. 値の初期化(すべてのPODのメンバーであります左未定義)

例:

class B 
{ 
    B b; 
    int value; 
}; 

// Variables of static storage duration (notably globals) 
// Will be zero initialized and thus b == false and value = 0 

B global; // Initialized 

int main() 
{ 
    // Object of automatic storage duration or dynamic storage duration 
    // These will depend on how they are declared. 

    // Value Initialization (POD re-mains undefined) 
    B bo1;   // b/value undefined 
    B* bp1 = new B; // b.balue undefined 

    // Zero Initialization 
    B bo2 = B();  // b = false, value = 0 
    B* bp2 = new B(); // b = false, value = 0 

    // Note: The most obvious syntax for zero initializing a local object 
    //  does not work as it is actually interpreted as a forward 
    //  declaration of a function; 
    B bo3(); 
} 
関連する問題