2011-01-05 212 views

回答

98

形式

operator TypeName() 

的成員函數是轉換算子。它們允許使用類類型的對象,就好像它們是TypeName類型的對象,當它們是時,它們將使用轉換函數轉換爲TypeName

在這種特殊情況下,operator bool()允許使用類類型的對象,就像它是bool一樣。例如,如果有一個名爲obj類類型的對象,你可以使用它作爲

if (obj) 

這將調用operator bool(),返回結果,並將結果作爲if的條件。

應該指出,operator bool()是一個非常糟糕的想法,你應該永遠不要使用它。有關詳細解釋爲什麼它不好並解決問題,請參閱"The Safe Bool Idiom."

(C++ 0x,即將發佈的C++標準修訂版,增加了對顯式轉換運算符的支持,這些將允許您寫一個安全的explicit operator bool(),可以正常工作,而不必跳過安全布爾成語的實現。)

+2

+1參考「拿來主義就好像它是一個布爾值」安全布爾成語 – greyfade 2011-01-05 02:35:29

+1

錯誤地暗示你可以,比方說,給它分配一個布爾值。相反,在海報的代碼中,它會生成一個類型爲bool的臨時變量,它與col的瞬時值有關,但此後與創建它的對象無關。此外,提到Safe Bool Idiom非常好,但僅僅註明存在相反的觀點:恕我直言,「永遠不會使用它」的建議超越了頂層 - 它以更混亂的API爲代價提供了更嚴格的編譯器檢查來防止愚蠢的濫用這可能會導致意外誤用。 – 2011-01-05 03:00:49

+1

@Tony:好吧,它可以用來當作布爾;由於轉換的結果是一個右值('bool'),否,你不能指定它。如果它是一個可修改的左值(例如'bool&'),那麼你可以指定它。至於正確性,我認爲一個'operator bool()'總是不正確的,因爲它允許在你永遠不想使用它的大量情況下使用類型對象。安全布爾是一個非常優越的選擇。 – 2011-01-05 03:17:38

1

這是一個隱含的轉換爲bool。即只要允許隱式轉換,您的類就可以通過調用該方法轉換爲bool

3

它是用戶定義的implicit轉換函數將您的類轉換爲truefalse

//usage 
bool value = yourclassinstance; //yourclassinstance is converted into bool! 
0

正如其他人所說的,它是用於類型轉換的,在這種情況下是bool。例如:

class A { 
    bool isItSafe; 

public: 
    operator bool() const 
    { 
     return isItSafe; 
    } 

    ... 
}; 

現在我可以使用這個類的一個對象,就好像它是一個布爾值:

A a; 
... 
if (a) { 
    .... 
} 
8
operator bool() const 
{ 
    return col != 0; 
} 

定義類是如何可轉化爲布爾值,之後的const()用於表示此方法不會改變(更改此類的成員)。

你通常會使用這樣的運營商如下:

airplaysdk sdkInstance; 
if (sdkInstance) { 
    std::cout << "Instance is active" << std::endl; 
} else { 
    std::cout << "Instance is in-active error!" << std::endl; 
} 
-1

另一種常見的用途是用於性病容器做鍵值相等比較裏面的自定義對象

class Foo 
{ 
    public: int val; 
}; 

class Comparer { public: 
bool operator() (Foo& a, Foo&b) const { 
return a.val == b.val; 
}; 

class Blah 
{ 
std::set< Foo, Comparer > _mySet; 
}; 
+0

這個例子使用'operator()'而不是'operator bool'。他們完全不同。 'operator()'是調用操作符,所以'Comparer'可以作爲一個函數被調用。這個'operator()'恰好會返回'bool',但這不會和'operator bool'相同,它只是允許隱式轉換爲'bool'。 – anthropomorphic 2014-08-16 02:56:47

4

我想給更多的代碼來說清楚。

struct A 
{ 
    operator bool() const { return true; } 
}; 

struct B 
{ 
    explicit operator bool() const { return true; } 
}; 

int main() 
{ 
    A a1; 
    if (a1) cout << "true" << endl; // OK: A::operator bool() 
    bool na1 = a1; // OK: copy-initialization selects A::operator bool() 
    bool na2 = static_cast<bool>(a1); // OK: static_cast performs direct-initialization 

    B b1;  
    if (b1) cout << "true" << endl; // OK: B::operator bool() 
    // bool nb1 = b1; // error: copy-initialization does not consider B::operator bool() 
    bool nb2 = static_cast<bool>(b1); // OK: static_cast performs direct-initialization 
}