2011-12-30 82 views

回答

10

即其中Bar實例轉換成Foo隱式用戶定義轉換功能。

Bar bar; 

Foo foo = bar; // bar implicitly converts into Foo. 

這是因爲如果你寫的:

Foo foo = Foo(25); 

如果你已經這樣的轉換功能,那麼你可以調用這個:

void f(Foo foo); //a function which accepts Foo 

f(bar); // bar implicitly converts into Foo. 

所以這種轉換可能不太合適,因爲它可能會導致問題,併產生意想不到的結果。爲了避免這種情況,可以使轉換功能明確爲(在C++ 11只):

//valid in C++11 only 

class Bar { 
    explicit operator Foo() { return Foo(25); } 
}; 

現在,這兩個會給予錯誤:

Foo foo = bar; //error 
f(bar); //error 

但是,以下是允許:

Foo foo = static_cast<Foo>(bar); //Ok 
f(static_cast<Foo>(bar)); //Ok 
+3

快速的手指,你已經得到了:) – Chad 2011-12-30 20:16:53

+0

使用'在C++ 11中引入了「顯式」用於運算符轉換? AFAIR只有構造函數可以明確在c + + 03中,或許我沒記錯...... – 2011-12-30 20:24:12

+0

@Als:你說得對。在C++ 03中,只有構造函數可以是顯式的。我在答覆中明確表達了這一點。 – Nawaz 2011-12-30 20:25:22

0

這是cast operator的超負荷。我能找到的最好的文檔是MSDN

基本上,如果你有一個Bar,你可以將它轉換爲一種構造具有特定值Foo

Bar b; 
Foo f = b; 
相關問題