2014-10-29 145 views
2

所以我寫了這個重載函數的分數類,它有變量num和den。C++重載操作符工作

fraction operator +(fraction & f1, fraction & f2) 
{ 
fraction temp; 

temp.num = (f1.num * f2.den) + (f1.den * f2.num ); 
temp.den = (f1.den * f2.den); 

return temp; 
} 

如果我使用此代碼爲f1 = f1+f2,它運行fine.But我想如果我嘗試用這種方式來使用它作爲f1 = f2+fraction(3,4) ,它顯示無效的操作數分數和分數。 任何人都可以識別這種錯誤和它爲什麼發生。提前致謝。

回答

5

類型fraction&需要通過必須是左值(一個對象,其地址 你可以採取)fraction類型的參數。但fraction(3,4)是臨時對象,而不是左值,所以它不能通過引用傳遞。

const fraction &不需要左值,臨時變量可以用作值。

而且f1f2不會operator +改變,所以你可以和應該改變參數聲明const &,允許按引用傳遞的臨時對象。

fraction operator +(const fraction & f1, const fraction & f2) 
+0

它會工作,如果它是f1 = f1 +分數(3,4)? – Yourfavouritenoob 2014-10-29 01:31:24

+0

@Yourfavouritenoob是的。 – songyuanyao 2014-10-29 01:32:33

+0

感謝兄弟,它像一條流淌的河流一樣工作......我可以問你爲什麼以及它是如何工作的? – Yourfavouritenoob 2014-10-29 01:37:13

0

我通常在這方面編寫一個+=然後+運營商。例如:

// member function 
fraction &fraction::operator +=(const fraction &f2) 
{ 
    num = num * f2.den + den * f2.num; 
    den *= f2.den; 
} 

// non-member function 
inline fraction operator+(fraction lhs, const fraction& rhs) 
{ 
    lhs += rhs; 
    return lhs; 
} 

注意的是,在第二個功能,lhs不是一個引用,但傳遞fraction的副本。它是該函數返回的副本的修改版本。非成員函數幾乎總是可以完全按照這種方式編寫。