次のコードを検討してください。
class A {
public:
int a;
};
class B : public A {
public:
B() { std::cout << "B[" << a << "]" << std::endl; }
};
class C : public B {
public:
C() { std::cout << "C[" << a << "]" << std::endl; }
};
int main(int argc, char *argv[]) {
B();
std::cout << std::endl;
C();
}
そしてその出力-g++でコンパイルされたプログラム(Ubuntu / Linaro 4.6.3-1ubuntu5)4.6.3:
B[0]
B[-2097962768]
C[-2097962768]
2番目の呼び出しを取得するために私が見つけた唯一の方法---C()
その値を初期化するために、コンストラクターに次のような明示的な呼び出しを追加することでした。
class B : public A {
public:
B() : A() { std::cout << "B[" << a << "]" << std::endl; }
};
class C : public B {
public:
C() : B() { std::cout << "C[" << a << "]" << std::endl; }
};
以前の各クラスのデフォルトコンストラクターを呼び出すと値が初期化されることは理解していますが、何も指定されていない場合に何が呼び出されているかを確認できません。
デフォルトのコンストラクターはデフォルトで呼び出されるものではありません-したがって、そのハンドルですか?