こんにちは。
コンストラクタを持つ型のメンバ変数はデフォルトコンストラクタで初期化されます。
コンストラクタを定義できる型は、structとclassですね。(unionも持てますが、話がややこしくなるので省略。)
structやclass型のメンバ変数は、それ自身が持つデフォルト・コンストラクタで初期化されると言う意味です。
ちょっと実験。
C++
1#include<iostream>
2
3class Foo
4{
5public:
6 Foo()
7 {
8 std::cout << "Foo::Foo()\n";
9 }
10};
11
12class Bar
13{
14 int mInt;
15 Foo mFoo;
16public:
17 Bar()
18 {
19 std::cout << "Bar::Bar()\n";
20 }
21 void print()
22 {
23 std::cout << "mInt=" << mInt << "\n";
24 }
25};
26
27int main(int argc, char** argv)
28{
29 Bar bar;
30 bar.print();
31
32 return 0;
33}
main()関数のBar bar;でbarのデフォルト・コンストラクタBar::Bar()が呼ばれます。
「コンストラクタを持つ型のメンバ変数」としてmFooが定義されています。
従って、上記のデフォルト・コンストラクタBar::Bar()が呼ばれる時、メンバ変数mFooのデフォルト・コンストラクタFoo::Foo()が呼ばれます。
順序は、下記となります。
①Bar::Bar()が呼ばれる。
②Barの「コンストラクタを持つ型のメンバ変数」のデフォルト・コンストラクタが呼ばれる。
(そのようなメンバ変数が複数ある時は、Barの中で各メンバ変数を定義した順序でよばれる。)
③Bar::Bar()のボディ部分({}の部分)が実行される。
ついでに、基本型のmIntも定義してます。print()関数で表示してますが、初期化されていないことが分かると思います。
Visual Studio 2015のC++での実行結果:
text
1Foo::Foo()
2Bar::Bar()
3mInt=-49900720
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/22 13:47