コンストラクタ

01	/****************************/
02	/* 時間データの処理         */
03	/*      coded by Y.Suganuma */
04	/****************************/
05	#include <stdio.h>
06	
07	/********************/
08	/* クラスTimeの宣言 */
09	/********************/
10	class Time {
11		public:
12			int hour, min, sec;
13						// コンストラクタ1
14			Time(int h, int m = 0, int s = 0)
15			{
16				hour = h;
17				min  = m;
18				sec  = s;
19			}
20						// 以下のように,メンバー初期設定リストを使用しても良い
21	//		Time(int h, int m = 0, int s = 0) : hour(h), min(m), sec(s) {}
22						// コンストラクタ2
23			Time() {}
24	};
25	
26	/************/
27	/* main関数 */
28	/************/
29	int main()
30	{
31		Time t1(10, 20, 23);   // 10:20:23  Time t1 = Time(10, 20, 23); と記述しても良い
32		printf("%2d:%2d:%2d\n", t1.hour, t1.min, t1.sec);
33		Time t2(12, 30);       // sec は 0 に初期設定される
34		printf("%2d:%2d:%2d\n", t2.hour, t2.min, t2.sec);
35		Time t3;               // 初期設定されない(内容は不定)
36		printf("%2d:%2d:%2d\n", t3.hour, t3.min, t3.sec);
37		return 0;
38	}
		
14 行目~ 19 行目

  3 つの引数を持つコンストラクタの定義です.ただし,2 番目及び 3 番目の引数に対しては,0 が代入されています.この記述により,3 番目,または,2 番目と 3 番目の引数が省略されたときは,それらの値は 0 とみなされます.この機能を,デフォルト引数と呼びます(一般的な関数においても同様).31 行目及び 33 行目のように,1 ~ 3 個の引数を記述してインスタンスを生成すると,このコンストラクタが呼ばれます.

23 行目

  引数を持たないコンストラクタの定義です.35 行目のように,引数を記述しないでインスタンスを生成すると,このコンストラクタが呼ばれます.変数 hour,min,sec は,初期設定されず,未定のままです.一般的な関数でも同様ですが,同じ名前の関数であっても,引数として渡されるデータの型が異なったり,引数の数が異なれば異なる関数とみなされ,引数の型及び数に対応して適切な関数が呼ばれます.これを,関数名のオーバーロードと呼びます.

  このプログラムにおいて,23 行目を記述しないで,35 行目を記述すればエラーになりますが,コンストラクタを全く記述しないで,35 行目を記述した場合は,23 行目のコンストラクタと同様の処理を行ってくれます.勿論,その場合は,31 行目,33 行目のような記述は出来ません.

  このプログラムによって,以下に示すような結果が得られます.
10:20:23
12:30: 0
2293544:1984934143:2293592