2016-06-06 49 views
24

如果方法應該返回B類型的對象,爲什麼它返回int的方法B minus它爲什麼會在返回一個對象的方法中返回一個int?

#include <iostream> 

class B 
{ 
public: 
    int a; 
public: 
    B(int i=0) 
    { 
     a=i; 
    } 
    B minus() 
    { 
     return (1-a); 
    } 
}; 

int main() 
{ 
    B x(18); 
    x = x.minus(); 
    std::cout << x.a << '\n'; 
    return 0; 
} 
+16

你沒有標註你的構造'explicit'。 – user2357112

+3

看看你的'B'構造函數。 「B」如何構建? – PaulMcKenzie

+0

我假設由於構造函數採用int,所以它也是從int中隱式構造的。 –

回答

53

具有單個參數的構造函數被認爲是一個轉換構造函數。當需要X類型的參數,並且給定類型Y時,編譯器將查找從Y到X的轉換構造函數(或類型轉換運算符)。在這種情況下,它會使用B(int)構造函數找到一個。實質上,您的return (1-a);更改爲return B(1-a);

正如在其他幾個(也是正確的)答案中提到的,如果您不希望構造函數被視爲轉換構造函數,則應該使用關鍵字explicit作爲前綴。

13

這是因爲單參數構造函數可以用作從參數類型到對象類型的隱式轉換。

在你的情況,你有一個構造函數接受一個類型爲int的參數,所以這個構造函數可以用來將int轉換爲B

爲了防止這些構造函數在轉換中使用,您應該標記構造函數explicit - 對於所有單參數構造函數,這是一個很好的做法,因爲在實踐中,這些隱式轉換通常比期望的更不理想。

27

return (1-a); 

調用隱式轉換構造

B(int i=0) 
{ 
    a=i; 
} 

因此,它是一樣的書寫

return B(1-a); 

注意,拷貝構造函數仍然產生,除非你delete它。


如果你想避免這種情況,寫

explicit B(int i=0) 
// ^^^^^^^^ 
    { 
     a=i; 
    } 

這實際上將強制用戶寫

return B(1-a); 
相關問題