是否有可能改變的if()
的行爲,使:C++「超載」的if()語句
class Foo {
int x;
};
Foo foo;
if(foo)
僅進行如果x
值是其他的東西比零?或...
將顯式的用戶定義的類型轉換爲int工作/將是一個適當的方法?或...
是否最好做類似if(foo.getX())
的東西?
是否有可能改變的if()
的行爲,使:C++「超載」的if()語句
class Foo {
int x;
};
Foo foo;
if(foo)
僅進行如果x
值是其他的東西比零?或...
將顯式的用戶定義的類型轉換爲int工作/將是一個適當的方法?或...
是否最好做類似if(foo.getX())
的東西?
您可以通過定義operator bool()
你的對象轉換爲一個布爾值:
explicit operator bool() const
{
return foo.getX();
}
的explicit
關鍵字可以防止隱式轉換從Foo
到bool
。例如,如果您不小心將foo
置於算術表達式foo + 1
中,則如果您將operator bool()
聲明爲explicit
,則編譯器可能會檢測到此錯誤,否則foo
將轉換爲bool
,即使並非有意也是如此。
在形式
operator TypeName()
的一般,成員函數(帶有可選explicit
和const
限定符)是轉換算子。它允許你將你的課程轉換爲TypeName
指定的任何類型。在另一個方向上,一個參數的構造函數允許你施放任何類型到類:
class Foo {
Foo(int x); // convert int to Foo
operator bool() const; // convert Foo to bool
int x;
};
它定義了你的類隱式轉換。如果可能,編譯器會嘗試應用這些轉換(例如,它對內置數據類型所做的操作,例如5 + 1.0
)。您可以聲明它們爲explicit
以抑制不需要的隱式轉換。
明確說明可能會更好。 – chris 2013-05-08 02:54:09
你絕對**想標記這個明確的,除非你想讓人們做像'!myClass'這樣的事情。 – templatetypedef 2013-05-08 02:55:54
可以定義操作員將對象轉換爲bool
class Foo
{
int x;
public:
operator bool() const
{
return x > 0;
}
};
但這個可以有,因爲隱式轉換的意想不到的後果bool
當你不想要的轉換不會發生。例如
int x = 42 + Foo();
C++ 11允許你聲明的轉換操作符爲explicit
,然後只允許在某些情況下隱式轉換,如if
語句中解決了這個問題。
explicit operator bool() const // allowed in C++11
現在
int x = 42 + Foo(); // error, no implicit conversion to bool
int x = 42 + static_cast<bool>(Foo()); // OK, explicit conversion is allowed
如果您需要這在C++ 03下,你可能想看看進入安全布爾成語:http://www.artima.com/cppsource/safebool .html – Yuushi 2013-05-08 03:13:04