2012-08-26 36 views
1

我有一個分數類如下。將加法運算符重載爲非成員函數會更好嗎?

class Fraction 
{ 
    int num, den ; 

    public: 
    //member functions here 
} ; 

我讀過一些書,我認爲'有效的C++',它是更好的重載加法運算符作爲非成員函數。給出的原因是它允許交換加法。 這是我的加法運算符的重載函數的原型。

Fraction operator + (const Fraction &obj, const int add_int) ; 

在這裏,當我打電話時,我必須這樣做。

f1 + 2 ; 

但它不會這樣工作。

2 + f1 ; 

爲此,我將不得不再次編寫函數並更改參數的順序。

我想知道是否有一種方法,我可以重載函數一次和執行交換加法?

+1

你不能有一個支持這兩種表單的函數。您將不得不提供免費站立功能重載。 '分數操作符+(const分數&obj,const int add_int);'和分數操作符+(const int add_int,const分數&obj) ;',這是正確的方法去處理它 –

+1

是否存在從'int'的隱式轉換到'Fraction'?如果是這樣,它可以完成,如果不是這樣的話 –

+0

你稍微錯誤地指出Effective C++。它實際上聲明'當類型轉換應該適用於所有參數時聲明非成員函數' –

回答

5

可以,但前提是你的類具有您要添加到該類型的隱式構造函數,所以這會工作:

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 

我無法想象你會想要禁止,但。

+1

而且這是不可取的... –

+0

感謝。 我有兩個對象添加,問題是剛剛與我質疑。 –

2

做這些事情:

  • 定義一個構造Fraction(int),使隱式轉換從intFraction

  • operator+=()定義爲成員函數。

  • 然後定義的operator+=()作爲operator+()而言:

    Fraction operator+(Fraction f1, Fraction const & f2) 
    { 
        f1 += f2; //call `operator+=` member function 
        return f1; 
    } 
    

    注意f1是按值傳遞。所以你可以給它添加f2,並返回它。

對於詳細的答案,在這裏看到我的回答類似的問題:

+0

好吧。但如果我在做隱式轉換,爲什麼我必須重載+ =運算符? –

+0

@CodingMash:因爲它是有道理的有o verload。如果你可以做'f1 = f1 + f2;'那你爲什麼不能'f1 + = f2;'也是?他們是一回事,對吧?瀏覽我答案中提供的鏈接;它解釋了這一切。 – Nawaz

+0

我明白了。我想說的是,對於f3 = f1 + f2,我不需要超載+ =運算符? –

1

不存在的,沒有語法結構,因爲+ - 運算符是根據定義不在C++中交換。這意味着您必須定義第二個版本,但在實現中調用帶有交換參數的第一個版本是合理的。

0

您需要用的隱式轉換,否則第二運營商的定義,但它是完全可能使第二個定義可重複使用的,所以你的代碼應該是這樣的:

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>類模板。

+0

謝謝... 我有它的模板化。 –