コンストラクタのこれらの部分はどのような順序で呼び出されますか?コンストラクタコンポーネントコールの順序
myClass::myClass(otherClass c) // part 1
: baseClass(thing) // part 2
{ // part 3
thing = c;
}
1,3,2?
コンストラクタのこれらの部分はどのような順序で呼び出されますか?コンストラクタコンポーネントコールの順序
myClass::myClass(otherClass c) // part 1
: baseClass(thing) // part 2
{ // part 3
thing = c;
}
1,3,2?
1,2,3。
最初の引数が評価されます。その後、初期化。その後、関数の本体。
引数の順序は不定です。
ctor initリストの順序は、クラス本体のメンバの順序です。
私のコードは、初期化されていない' Thing'オブジェクトを基本クラスに渡すと言っていますか? – SirYakalot
@SirYakalotはい。 – Max
は、親クラスの初期化前に呼び出された関数の本体ですか?つまり、コンストラクタは継承階層で重複していますか? – SirYakalot
パート1では評価が行われません。それは 関数を呼び出す方法を説明し、そして名もちろん コールに評価しなければならないの引数は、(機能。
初期化は、コンストラクタ本体が入力される前を発生する。まず すべての仮想基底クラスが初期化され、 の深さから最初に継承階層を左から右に検索した結果、 非仮想基本クラスは、クラス定義に現れる の左から右の順番で初期化され、最後にメンバーは は、クラス定義で宣言されている順序で初期化されます。 初期化子がコンストラクタに表示されるr は、順序に影響しません。
最後に、コンストラクタ本体(パート3)が実行されます。
あなた自身でテストしましたか?それぞれのコンストラクタに 'println'sを追加し、それらが呼び出される順番を確認してください:) –
@KshitijMehta私はいつも' println'がJavaのものだと考えました – Flexo
私はそれを台無しにしたと信じられません!私はこれをタイプするとJavaでプログラミングしています。私は無意識にprintlnをタイプしました!完全に 'cout'を意味する –