背景:我們在程序中往往需要對一個類實(shí)例的合法性進(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)我們比較兩個類實(shí)例時,由于我們提供了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類型對象實(shí)例自動轉(zhuǎn)換為bool變量了,原來的兩個類實(shí)例比較代碼能編譯通過的問題解決了邪媳。