c++中的類型轉(zhuǎn)換operator

背景:我們在程序中往往需要對一個類實例的合法性進(jìn)行檢查,大部分的程序員都會想到在類的方法中提供一個方法檢查合法性(比如提供一個IsValid函數(shù)),但是還有一個更好的方法就是提供一個類型轉(zhuǎn)換的operator,下面就來介紹下。

  • 方法1:傳統(tǒng)方法
class MyClass {
public:
    bool IsValid() {return true;}
};

int main()
{
    MyClass obj;

    if (obj.IsValid()) {
        // do something
    }

    return 0;
}
  • 方法2:提供轉(zhuǎn)換操作符
class MyClass {
public:
    operator bool() {return true;}  // 轉(zhuǎn)換操作符,寫法是operator TypeName()
};

int main()
{
    MyClass obj;

    if (obj) {
        // do something
    }

    return 0;
}

可以看的出來,如果提供了轉(zhuǎn)換操作符之后,在應(yīng)用代碼中直接就可以寫成if (xxx)了,比較的方便。
轉(zhuǎn)換操作符的寫法:operator TypeName()。

但是此方法會帶來一些額外的問題,看下面的代碼:

#include <iostream>

class MyClass {
public:
    operator bool() {return true;}  // 轉(zhuǎn)換操作符,寫法是operator TypeName()
};

int main()
{
    MyClass obj1, obj2;

    if (obj1 == obj2) {   // 這里不應(yīng)該編譯通過
        // do something
    }

    return 0;
}

當(dāng)我們比較兩個類實例時,由于我們提供了bool類型的轉(zhuǎn)換操作符,所以編譯器會自動將obj1和obj2先轉(zhuǎn)換為bool變量,然后進(jìn)行比較,這顯然不是我們想要的。

幸好,在C++11之后提供了“explicit”關(guān)鍵字,可以很優(yōu)雅的解決這個問題。

  • 建議方法:使用轉(zhuǎn)換操作符,并且在操作符之前使用C++11 explicit關(guān)鍵字
class MyClass {
public:
    explicit operator bool() {return true;}  // 轉(zhuǎn)換操作符,并且前面加explicit關(guān)鍵字
};

int main()
{
    MyClass obj1, obj2;
    
    // 編譯通過
    if (obj1) {
        // do something
    }
    
    // 編譯不通過
    if (obj1 == obj2) {   
        // do something
    }

    return 0;
}

可以看到,加了“explicit”關(guān)鍵字之后,編譯器就不會自動將MyClass類型對象實例自動轉(zhuǎn)換為bool變量了,原來的兩個類實例比較代碼能編譯通過的問題解決了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容