匯東網


(轉載)C++ explicit 關鍵字詳解

[編輯] [转简体]
|
作者:huidong | 分類:【編程】C/C++
[ 47 瀏覽 0 評論 12 贊 20 踩 ]

概要
explicit 關鍵字只用於類內的單參數構造函數前面,用於避免隱式轉換。

正文

隱式轉換就像是這樣:

class MyClass
{
private:
    int n;

public:
    MyClass(int i)
    {
        n = i;
    }
};

int main()
{
    // 隱式轉換示例
    MyClass var = 10;

    return 0;
}

顯式轉換就像是這樣:

class MyClass
{
private:
    int n;

public:
    explicit MyClass(int i)    // 這裏指定 explicit 關鍵字
    {
        n = i;
    }
};

int main()
{
    // 顯式轉換示例
    MyClass var(10);

    // 下面這句會導致編譯報錯,因爲指定了 explicit 關鍵字,無法再進行隱式轉換
    //MyClass var = 10;

    return 0;
}

explicit 關鍵字只用於類內的單參數構造函數前面,由於無參數的構造函數和多參數的構造函數總是顯式調用,因此在這些構造函數前面加 explicit 毫無意義。

Google 的 C++ 規範中提到 explicit 的優點是可以避免不合時宜的類型轉換,缺點無。所以 Google 規定所有的單參數構造函數都必須是顯示的,只有極少數情況下拷貝構造函數可以不聲明爲 explicit(例如作爲其他類的透明包裝器的類)。

Effctive C++ 中說:被聲明爲 explicit 的構造函數通常比其 non-explicit 兄弟更受歡迎,因爲它們禁止編譯器執行非預期(往往也不被期望)的類型轉換。除非我有一個好理由允許構造函數被用於隱式類型轉換,否則我會把它聲明爲 explicit。

(轉載自 https://www.cnblogs.com/rednodel/p/9299251.html,有刪改)

[ 12] [ 20]


 評論區  0 條評論

+ 添加評論