一、構造函數
在類中有一種特殊的成員函數,它的名字與類名相同,我們在創建類的時候,這個特殊的成員函數就會被系統調用。這個成員函數,就叫“構造函數”。
因為構造函數會被系統自動調動,構造函數的目的就是初始化類對象的數據成員。
(1)構造函數沒有返回值,這是構造函數的特殊之處。
(2)不可以手工調用構造函數,否則編譯會出錯。
(3)正常情況下,構造函數應該被聲明為public,因為創建一個對象時,系統要替我們調用構造函數,這說明構造函數是一個public的成員
類缺省的成員是私有成員,因此對於構造函數我們必須將其聲明為public
class Time { private: int Millsecond; // 毫秒 public: int Hour; // 小時 int Minute; // 分鍾 int Second; // 秒鍾 void initTime(int tmpHour, int tmpMinute ,int tmpSecond) { Hour = tmpHour; Minute = tmpMinute; Second = tmpSecond; } void initMillTime(int mls) { Millsecond = mls; // 成員函數可以訪問成員變量,不管成員是否私有 } public: // 構造函數 Time(int tmpHour, int tmpMinute ,int tmpSecond = 12) { Hour = tmpHour; Minute = tmpMinute; Second = tmpSecond; initMillTime(0); cout << “調用了構造函數” <<endl; } Time() // 不加參數的構造函數 { Hour = 0; Minute = 0; Second = 0; initMillTime(0); cout <<”不加參數的構造函數” <<endl; } // 單參數構造函數 Time(int tmpHour) { Hour = tmpHour; Minute = 59; Second = 59; initMillTime(0); cout << “調用了構造函數Time(int tmpHour)” <<endl; } } Time MyTime = Time(12,13,52); // 創建類對象 Time MyTime1(12,13,52); // 創建類對象
二、多個構造函數
一個類中可以有多種構造函數,就可以為類對象的創建提供多種初始化方法,但是多個構造函數需要有點不同的地方,比如參數數量或者參數類型。
對象拷貝
Time mytime2; // 可以調用無參數構造函數 // 下面四個對象並沒有調用傳統意義上的構造函數,他們調用的實際上是拷貝構造函數。 Time myTime22 = mytime2; Time myTime23(mytime2); Time myTime24{myTime2}; Time myTime25 = {myTime2};
三、函數默認參數
規定:
(1)默認值只能放在函數聲明中,除非改函數沒有函數聲明。
(2)在具有多個參數的函數中指定默認值,默認參數必須出現在不默認參數的右邊,一旦某個參數開始指定默認值,那么它右邊的參數必須全部指定默認值。
Time mytime50 = Time(10,11); // 調用構造函數的時候,若有參數指定默認值,則可以不再參數列表中寫。
四、隱式轉換與explicit
Time mytime40 = 42; // 42 // 調用了單參數的構造函數 Time mytime41 = (1,2,3,4,5,6); // 6 系統將數字轉換為臨時的Time對象 Time mytime100 = {16}; // 正常寫法,帶一個參數16可以讓系統明確的知道調用那個構造函數。 Time mytime101 = 16; // 含糊不清的寫法,存在臨時對象隱式轉換的問題 //是否可以強制系統,明確要求構造函數不能做隱式類型轉換? //可以,如果構造函數聲明中帶有explicit,則這個構造函數只用於初始化和顯式類型轉換; // 構造函數前面加explicit explicit Time(int Hour,int Minute,int Second); Time myTime = Time(12,13,14); Time myTime(12,13,14); Time myTime = Time{12,13,14}; Time myTime{12,13,14}; //Time myTime = {12,13,14); // 做了隱式類型轉換,出問題,復制列表初始化 //對於單參數的構造函數,一般都聲明為explicit,除非你有特殊的理由。 //不允許直接調用構造函數。
五、構造函數初始化列表
Time::Time(int tmpHour,int tmpMinute,int tmpSecond):Hour(tmpHour),Minute(tmpMinute),Second(tmpSecond) { }