構造函數詳解,explicit,初始化列表


一、構造函數

在類中有一種特殊的成員函數,它的名字與類名相同,我們在創建類的時候,這個特殊的成員函數就會被系統調用。這個成員函數,就叫“構造函數”。

因為構造函數會被系統自動調動,構造函數的目的就是初始化類對象的數據成員。

(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)
{

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM