p270〜p312まで

クラス!ざざっと!

引数つきコンストラク

これは知らんかった・・・。

// Integerクラスを定義済み
Integer array[4] = {
  Integer(),
  Integer(3),
  Integer(6),
};
p283:クラス配列の初期化

おれ、今までどうやってクラス配列初期化してきたんだろう・・・。使う必要がなかっただけかな?半年前ならmemsetしてそうだ。仮想テーブルポインタが死んじゃう死んじゃう。こわいわこ。

デストラク

p290:中段
そのクラスのデストラクタを実行し終えると、
次に全メンバ変数のデストラクタが自動的に呼ばれます。

p293:上段
同時に複数の変数の寿命が尽きるときには変数を作ったときと逆順にデストラクタが呼ばれる。

ほほう。それならばテストじゃ!
destructor_test.cpp

#include <iostream>
using namespace std;
// デストラクトの順番テスト

class Hoge1
{
public:
	~Hoge1()
	{
		cout << "Hoge1が開放" << endl;
	}
};

class Hoge2
{
	Hoge1 hoge1;

public:
	~Hoge2()
	{
		cout << "Hoge2が開放" << endl;
	}
};

class Fuga
{
private:
	int num;
public:
	Fuga(int num)
		:num(num)
	{}
	~Fuga()
	{
		cout << num << endl;
	}
};

int main()
{
	Hoge2 hoge2;

	Fuga fuga1(1);
	Fuga fuga2(2);

	return 0;
}

実行結果

2
1
Hoge2が開放
Hoge1が開放

ほほう。確かにその通りでござる。ちなみに変数を作った順と逆順にデストラクトされる理由は前に作った変数で後に作った変数を初期化している可能性があるから。もしそこでポインタ渡してdeleteとかしちゃうと危ない!ってことらしいっす。まぁ逆も作ろうと思えば作れるけれども。

p292:下段
グローバル変数のコンストラクタはmainが実行されるより前に実行される。

p293:中段
なお、グローバル変数を複数作った場合、
各ファイル内においては変数の実体定義の出現順に初期化が行われ、
異なるファイルにあるグローバル変数との間の初期化順は決まっていない。
デストラクタが呼ばれる順番はコンストラクタが呼ばれた順とは逆順。

ちゃんと覚えてなかったのでメモ。知ってるんだけどなんか認識不足ってのが多い。
グローバル変数のやつは知らんかった。グローバル変数同士、依存しあったインスタンス作るとまずいわけですな。

p293:注意
exit関数を呼んでプログラムを終了した場合、
デストラクタは静的変数のものしか呼ばれず、自動変数のデストラクタは呼ばれない。

これもはじめて知った。exitも注意して使わんといかんですね。普通のプログラムで使うのかは知らんけど。

コピーコンストラク

p302:上段
基本形にもコピーコンストラクタが存在し、
基本形のコピーコンストラクタは引数の値で変数を初期化するだけ。

知っているけど重要な気がするんでメモっといた。

代入演算子

p306:下段
IntArray b = a; と IntArray b(a) ;は同じ。

知っているけどこれも認識が甘いのでメモ。同様に下も。

p308:中段
b = a; と b.operator=(a); は同じ。というか、そういう風に解釈される。

クラスの最初はまぁこんなもんかなー。デストラクタの実行順番はちょっと覚えといたほうがいいかも。