アフィリエイト広告を利用しています

広告

posted by fanblog

2017年12月10日

《その172》 派生クラスオブジェクトの初期化順序 & p.161演習4-2


 派生クラスオブジェクトの初期化順序

 派生クラスのコンストラクタが初期化作業を行うとき、その作業は次の順序で実行されます。

(1) 基底クラス部分オブジェクトの初期化
   初期化作業は、基底クラスのコンストラクタに任せる。

(2) データメンバの初期化
   クラス定義内で宣言された順に、データメンバが初期化される。

(3) コンストラクタ本体の実行


新版明解C++中級編 p.161 演習4-2
 次のプログラムによって、派生クラスオブジェクトの初期化順序を確認することができる。
このプログラムを、デストラクタの起動順序を確認できるように書きかえたプログラムを作成せよ。

// ------------------------------------
#include <iostream>
using namespace std;

// クラス Derived の基底クラス
class Base {
int x;
public:
Base(int a = 0) : x(a) {
cout << "Base::x を" << x << "で初期化。\n";
}
};

// クラス Derived にメンバとして含まれるクラス
class Memb {
int x;
public:
Memb(int a = 0) : x(a) {
cout << "Memb::x を" << x << "で初期化。\n";
}
};

// 派生クラス Derived を生成
// (基底クラス Base から public派生)
class Derived : public Base {
int y;
Memb m1;
Memb m2;
void say() {
y = 0;
cout << "Derived::y を" << y << "で初期化。\n";
}
public:
Derived() { say(); }
Derived(int a, int b, int c)
: m2(a), m1(b), Base(c) {
say();
}
};

int main() {
Derived d1;
cout << '\n';
Derived d2(1, 2, 3);
}

// *** 実行結果 ****************
// * Base::x を0で初期化。 *
// * Memb::x を0で初期化。 *
// * Memb::x を0で初期化。 *
// * Derived::y を0で初期化。 *
// * *
// * Base::x を3で初期化。 *
// * Memb::x を2で初期化。 *
// * Memb::x を1で初期化。 *
// * Derived::y を0で初期化。 *
// *****************************
// ------------

◆以下が解答のプログラムと、その実行結果です。

// p161_演習4-2
#include <iostream>
using namespace std;

// クラス Derived の基底クラス
class Base {
int x;
public:
Base(int a = 0) : x(a) {
cout << "Base::x を" << x << "で初期化。\n";
}
~Base() { cout << "デストラクタ ~Base, "
<< "x = " << x << '\n';
}
};

// クラス Derived にメンバとして含まれるクラス
class Memb {
int x;
public:
Memb(int a = 0) : x(a) {
cout << "Memb::x を" << x << "で初期化。\n";
}
~Memb() { cout << "デストラクタ ~Memb, "
<< "x = " << x << '\n'; }
};

// 派生クラス Derived を生成
// (基底クラス Base から public派生)

class Derived : public Base {
int y;
Memb m1;
Memb m2;
void say() {
y = 0;
cout << "Derived::y を" << y << "で初期化。\n";
}
public:
Derived() { say(); }
Derived(int a, int b, int c)
: m2(a), m1(b), Base(c) {
say();
}
~Derived() { cout << "\nデストラクタ ~Derived, "
<< "y = " << y << '\n';
}
};

int main() {
Derived d1;
cout << '\n';
Derived d2(1, 2, 3);
}
f04_02.png
 この実行結果から、デストラクタの起動順序は、コンストラクタの初期化作業のときとは逆の順序であることが確認できます。



新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/11/10 13:13時点)

新版 明解C 中級編 (明解シリーズ)

新品価格
¥2,916から
(2017/11/10 13:14時点)





この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/7075621
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。