explicit 隱式轉換與顯示轉換

explicit關鍵字:用於防止單參數構造函數隱式轉換功能(多參數構造函數不會執行隱式轉換)

class myDig {
    int value;
public:
    explicit myDig(int n) {
        value = n;
    }
}

void doSomething(myDig num); //函數,接受一個myDig參數,函數體不重要,故省略

void Test1() {
    myDig dig1;        // 錯誤,沒有默認構造函數
    doSomething(dig1); // 正確
    myDig dig2(10);       // 正確
    doSomething(10); // 錯誤,myDig不支持隱式轉換
    doSomething(myDig(10)); //正確,調用**類型轉換操作符**進行顯示轉換(也叫轉型,cast), 調用myDig構造函數。
}

/*
 * 如果去掉explicit則doSomething(10)正確, 執行了隱式轉換
 * 過程相當於執行 myDig tmp(10); doSomething(tmp);
 * 
 * myDig dig3 = 10; //正確,也是隱式轉換。
 * /

在Effective c++中

被聲明爲explicit的構造函數通常比其non-explicit兄弟更受歡迎,因爲它們禁止編譯器執行非預期(往往也不被期望)的類型轉換。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章