[英]Is it better to overload addition operator as non-member function?
我有一個Fraction類如下。
class Fraction
{
int num, den ;
public:
//member functions here
} ;
我讀了一些書,我認為'有效的c ++'最好將加法運算符重載為非成員函數。 給出的原因是它允許交換加法。 這是我為加法運算符重載函數的原型。
Fraction operator + (const Fraction &obj, const int add_int) ;
在這里,當我打電話時,我必須這樣做。
f1 + 2 ;
但它不會這樣。
2 + f1 ;
為此,我將不得不再次編寫該函數並更改其中的參數順序。
我想知道是否有一種方法可以讓我一次重載函數並執行可交換的加法?
您可以,但前提是您的類具有要添加的類型的隱式構造函數,因此這將起作用:
class Fraction
{
int num, den;
public:
Fraction(int n) :num(n), den(1) {}
// member functions here
};
Fraction operator+(Fraction lhs, Fraction rhs) { ... }
int main()
{
Fraction f1(5);
f1 = f1 + 5;
f1 = 5 + f1;
}
當然,這允許您實際上沒有提到的用法,即添加兩個Fraction
對象的能力。
Fraction f1(1), f2(2);
Fraction f3 = f1 + f2
我無法想象你會想要不允許這樣做。
做這些事情:
定義構造函數Fraction(int)
以啟用從int
到Fraction
隱式轉換。
將operator+=()
定義為成員函數。
然后根據 operator+=()
定義operator+()
:
Fraction operator+(Fraction f1, Fraction const & f2) { f1 += f2; //call `operator+=` member function return f1; }
請注意, f1
按值傳遞。 所以你可以添加f2
,然后返回它。
有關詳細解答,請在此處查看類似問題的答案:
沒有沒有語法結構,因為+ -operator是每個定義在c ++中不可交換的。 這意味着您必須定義第二個版本,但是在實現中調用帶有交換參數的第一個版本是合理的。
您需要隱式轉換或第二個運算符定義,但完全可以使第二個定義可重用,因此您的代碼將如下所示:
class Fraction : public commutative<Fraction>
{
int num, den ;
friend Fraction operator+ (int add_int, Fraction obj);
public:
//member functions here
};
Fraction operator+ (int add_int, Fraction obj);
如果您想要commutative<T>
類模板的示例代碼,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.