C++のスティッキーコーナーの1つに触れています。
オブジェクト内のPOD値の初期化は粘着性があり、いくつかの事柄によって異なります。
でも、私はすべてのルールを正しいものにすることができるかどうかはわかりませんが、@ Steve Jessopはかつてここに記事を書いていました(私は現在見つけることができますが)。
しかし、いくつかの例:
このクラスは、常にそれがより複雑である明示デフォルトコンストラクタがなければB == falseの値= 0
class A
{
A() : b(), value() {}
B b;
int value;
};
初期化されます。
ここで、コンパイラはデフォルトコンストラクタを生成します。しかし、コンパイラがどのようにデフォルトコンストラクタを生成したかは状況によって異なります。コンパイラ生成されるデフォルトのコンストラクタは、初期化の2つの異なる形式を行うことができますし、文脈に依存して使用されている:
- ゼロ初期化(すべてのPODのメンバーが出zero'edされている)
- 値の初期化(すべての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();
}
あなたはどのような意味ですか? – Eilidh
A :: A(){}を空にしても入力することをお勧めしますか? – Eilidh
もしあなたが書いていないのであれば:b()、value()、コンパイルはあなたのためにそれを行い、コンストラクタに与える引数を持っているときや、例えば0以外の値をintに変換する – hidayat