2017年11月07日
《その109》 デストラクタ(p.495演習14-1)
デストラクタ
・クラスオブジェクトが破壊される直前に呼び出されるメンバ関数。
・デストラクタの名前は「 ~クラス名 」とする。
・返却値をもたず、引数も受け取らない。
・動的に確保した領域を開放する等の処理を記述する。
デストラクタの定義例
class IntArray {
int nelem; // 配列の要素数
int* vec; // 先頭要素へのポインタ
public:
explicit IntArray(int size)
: nelem(size), vec(new int[nelem]) { }
// ↑ コンストラクタ … 動的記憶期間を持つ領域を確保
~IntArray() { delete[] vec; }
// ↑ デストラクタ … 動的記憶期間を持つ領域を解放
・・・・・・
};
デストラクタが実行される順序
データメンバの初期化は、クラス定義の際のデータメンバの宣言順に行われます。
一方、データメンバが破棄される直前に呼び出されるデストラクタは、クラス定義の際のデータメンバの宣言とは逆の順序で呼び出されます。
新版明解C++入門編 p.495 演習14-1
デストラクタがデータメンバの逆順に呼び出されることを各難するためのプログラムを作成せよ。
// p495_演習14-1
#include <iostream>
using namespace std;
class Int {
int n_;
public:
Int(int n) : n_(n) {
cout << "コンストラクタ Int /// " << n_ << '\n';
}
~Int() {
cout << "デストラクタ ~Int /// " << n_ << '\n';
}
};
class Abc {
Int a;
Int b;
Int c;
Int d;
public:
Abc(int aa, int bb, int cc, int dd)
: b(bb), d(dd), c(cc), a(aa) { }
~Abc() { }
};
int main() {
Abc abc(1, 2, 3, 4);
cout << "------\n";
}
--
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6942172
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック