operator bool()是什么
在C++中,operator TypeName()
語法用來將對象轉換為指定的TypeName
類型,當這里TypeName
為bool
時,就可以直接在條件判斷式里面直接用該對象:
#include <iostream>
class Foo {
public:
operator bool() const {
return true;
}
};
int main(int argc, const char* argv[]) {
Foo foo;
if (foo) {
std::cout << "true" << std::endl;
}
return 0;
}
問題
但operator bool()
語法會遇到一些問題,比如隱式類型轉換,還有相等測試無法檢測書寫錯誤:
#include <iostream>
class Foo {
public:
operator bool() const {
return true;
}
};
int main(int argc, const char* argv[]) {
Foo foo1;
Foo foo2;
// 這里==寫成了=,但編譯不會報錯
if (foo1 = foo2) {
std::cout << "true" << std::endl;
}
// 這里的隱式類型轉換一般沒有意義
bool flag = foo1;
return 0;
}
隱式類型轉換的問題可以在定義的時候加上explicit
解決,和構造函數中的一樣,賦值的時候只有顯式類型轉換才可以編譯:
#include <iostream>
class Foo {
public:
// 加上explicit關鍵字
explicit operator bool() const {
return true;
}
};
int main(int argc, const char* argv[]) {
Foo foo1;
Foo foo2;
// 這里==寫成了=,但編譯不會報錯
if (foo1 = foo2) {
std::cout << "true" << std::endl;
}
// 隱式類型轉換,編譯錯誤
bool flag = foo1;
return 0;
}
建議
個人還是覺得盡量不要用這種語法,還是像java那樣寫出特定名字的判斷函數最好。C++也真是,搞這些復雜的語法太多了,反而影響語言使用者學習。