2017年10月22日
《その88》 メンバ部分オブジェクトの初期化(p.411演習11-4)
メンバ部分オブジェクトの初期化
前回《その87》、クラスがクラス型メンバを持つときの初期化について書きましたが、ここでもう一度確認しておきます。
【クラス型メンバが初期化されるまでの過程】
(1) デフォルトコンストラクタによって、クラス型メンバの初期化が行われる。
(2) 与えられた引数を用いて、クラス型メンバに代入するための一時オブジェクトが生成される。
(3) コンストラクタ本体が実行されて、初期化済のクラス型メンバに (2) の一時オブジェクトが
代入される。
メンバ部分オブジェクトの初期化が (1), (2), (3) の順序で行われることが、次の演習11-4 で確認できます。
新版明解C++入門編 p.411 演習11-4
コンストラクタ初期化子によって明示的に初期化しない場合に、メンバ部分オブジェクトがデフォルトコンストラクタで初期化されることをプログラムを作成して確認せよ。
// p411_演習11-4
#include <iostream>
using namespace std;
class Sub {
int p; int q;
public:
Sub() { p = 1; q = 2; } // クラス Sub のデフォルトコンストラクタ
Sub(int p, int q) {
this->p = p; this->q = q;
}
int get_p() const { return p; }
int get_q() const { return q; }
};
class Test {
int a;
Sub sub; // メンバ部分オブジェクト sub
public:
Test(int a, int p, int q);
};
Test::Test(int a, int p, int q) {
this->a = a;
cout << sub.get_p() << " " << sub.get_q() << '\n';
/*
↑ のコードが実行される段階で、p が 1, q が 2 であると出力される。
このことから、次の
sub = Sub(p, q);
が実行されていない段階で、すでに
デフォルトコンストラクタ Sub() で初期化された Sub型のオブジェクトが生成されて
いることがわかる。
*/
sub = Sub(p, q);
/*
↑ 構築済みのオブジェクト sub に対する代入。
Sub(int p, int q) によって生成された一時オブジェクトの値が sub に代入される。
*/
cout << sub.get_p() << " " << sub.get_q() << '\n';
/*
↑ 最終的に、p が 1234, q が 5678 になっている。
*/
}
int main() {
Test test(0, 1234, 5678);
}
--
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6885839
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック