コンストラクタ、デストラクタ

■コンストラクタ

コンストラクタはクラスで宣言、定義ができる特殊なメンバ関数で、
クラスを変数として宣言した時(メモリ上に作成される時)に
自動的に呼び出されます。

●コンストラクタの役割
	コンストラクタはクラスを生成した際に呼び出される関数なので、
	この関数で行う役割はメンバ変数の初期化が主な役割になります。
	コンストラクタでメンバ変数の初期化を行い、
	すぐに使用できる状態にすれば、使い勝手がよくなるので
	プログラミングの効率が良くなります。

●コンストラクタのルール
	・例
		class Jugyoin
		{
		public:
			// コンストラクタ
			Jugyoin();	// ①
		private:
			int m_Number;
		};

		Jugyoin::Jugyoin() // ②
		{
			m_Number = 1001;
		}

		上記のソースはコンストラクタの例です。
		コンストラクタにはいくつかのルールがあるので
		以下でそちらの説明を行います。

		①.関数名
			コンストラクタの関数名は定義しているクラス名が関数名になります。
			例えばJugyoinというクラス名だったら、Jugyoin、
			PlayerだったらPlayerが関数名になります。

		②.コンストラクタの定義
			コンストラクタの定義は特殊で本来のメンバ関数の基本的な形は
			「戻り値の型 クラス名::関数名(引数)」ですが、
			コンストラクタは「クラス名::関数名(引数)」となっており
			戻り値の型の記述が不要です。

			書式例:
				クラス名::関数名()
				{
				}

			具体例:
				Jugyoin::Jugyoin()
				{
				};

●オーバーロード
	コンストラクタはオーバーロードの機能を使用して
	複数のコンストラクタを作成することができます。
	これによって、状況に応じたクラスの作成が可能となります。

	・例
		class Jugyoin
		{
		public:
			Jugyoin(void);
			Jugyoin(int num, char *name, int salary);
			void ShowInfo(void);
		private:
			int m_Number;
			char m_Name[32];
			int m_Salary;
		};

		Jugyoin::Jugyoin(void)
		{
			m_Number = 1001;
			strcpy_s(m_Name, "山田太郎");
			m_Salary = 220000;
		}

		Jugyoin::Jugyoin(int num, char *name, int salary)
		{
			m_Number = num;
			strcpy_s(m_Name, name);
			m_Salary = salary;
		}

		void Jugyoin::ShowInfo(void)
		{
			printf("社員番号 = %d\n", m_Number);
			printf("名前 = %s\n", m_Name);
			printf("給料 = %d\n", m_Salary);
		}

		void main(void)
		{
			Jugyoin jugyoin1;
			Jugyoin jugyoin2(1002, "佐藤一郎", 200000);

			jugyoin1.ShowInfo();
			jugyoin2.ShowInfo();
		}

		実行結果:
			社員番号 = 1001
			名前 = 山田太郎
			給料 = 220000
			社員番号 = 1002
			名前 = 佐藤一郎
			給料 = 200000

●デフォルトコンストラクタ
	デフォルトコンストラクタとは引数が存在しないコンストラクタのことです。
	デフォルトコンストラクタは変数宣言や動的確保の際に
	()を指定していなければ自動的に実行されます。

	・例
		class Jugyoin
		{
		public:
			Jugyoin();
			int m_Number;
		};

		Jugyoin::Jugyoin()
		{
			m_Number = 1001;
		}

		void main(void)
		{
			Jugyoin jugyoin;

			printf("m_Number = %d\n", jugyoin.m_Number);
		}

		実行結果:
			m_Number = 1001

■デストラクタ

デストラクタはクラスが破棄される際に自動的に呼び出される
特殊なメンバ関数です。
	
●クラス破棄のタイミング
	クラスを破棄するタイミングは主に以下の3つが考えられます。
		1.プログラム終了
		2.変数の寿命が尽きた
		3.new作成した動的なクラスをdelete関数で破棄する

●デストラクタの役割
	デストラクタの役割は終了時に呼び出されることから
	メンバ変数の後始末が主な役割になります。
	メンバ変数の後始末といってもintやfloatなどの通常の変数は
	そのままメモリが解放されるだけなので問題はないのですが、
	ポインタ変数をメンバに持っている場合は適切な解放処理を行う必要があります。

●デストラクタのルール
	・例
		class Jugyoin
		{
		public:	// ②
			// コンストラクタ
			Jugyoin();

			// デストラクタ
			~Jugyoin();	// ①
		private:
			int *m_Number;
		};

		Jugyoin::Jugyoin()
		{
			m_Number = new int;
		}

		Jugyoin::~Jugyoin() // ③
		{
			delete(m_Number);
		}

		上記のソースはデストラクタの例です。
		ルール自体はコンストラクタとほぼ変わりませんが
		以下に記述します。

		①.関数名
			デストラクタの関数名は定義しているクラス名に
			~(チルダ)をつけます。
			例えばJugyoinというクラス名だったら、~Jugyoin、
			Playerだったら~Playerが関数名になります。

		②.public指定
			デストラクタも必ずpublicの範囲内に定義する必要があります。
			privateやprotectedではエラーになるので気をつけてください。

		③.デストラクタの定義
			デストラクタの定義もコンストラクタと同じで
			関数の定義は「クラス名::関数名(引数)」となっており、
			戻り値の型の記述が不要です。

			書式例:
				クラス名::関数名()
				{
				}

			具体例:
				Jugyoin::~Jugyoin()
				{
				};

		④.オーバーロード不可
			デストラクタはコンストラクタと違い引数を追加して
			オーバーロードで呼び出すことができません。