2012-01-16 36 views
1

嗨我想爲+(加法)操作符來添加我的用戶定義的數據類型對象的操作符重載。 以下是該代碼。如何添加標準和用戶定義的對象?

#include <iostream> 
using namespace std; 
class complex { 
    int i; 
    double f; 
public: 
    complex(int ii=0,double ff=0){ 
     i = ii; 
     f = ff; 
    } 
    complex operator+(complex object) { 
     complex result; 
     result.i = this->i + object.i; 
     result.f = this->f + object.f; 
     return result; 
    } 
    void display() { 
     cout << i <<"\t"<< f; 
     cout << endl; 
    } 
}; 
int main(){ 
    complex obj1(1,1.1),obj2(2,2.2),obj3; 
    int i(5); 
    obj3 = obj1 + obj2; 
    obj3.display(); 
    obj3 = obj3 + i; 
    obj3.display(); 
    obj3 = i + obj3;//generates me compiler error 
    obj3.display(); 
    return 0; 
} 

據我瞭解,當我做OBJ1 + obj2的,它是由編譯器爲obj1.operator擴張+(OBJ2); 因此,這部分代碼工作正常。

但是,當我做添加一個int和複雜的,我認爲它擴展爲i.operator(obj1)。

因此,它給我編譯錯誤。

我應該在int類中定義operator +函數還是如何解決這個問題? 請建議, 謝謝

+0

我建議你閱讀關於什麼運營商通常可以做什麼,應該做什麼,實現爲免費功能的地方。 – PlasmaHH 2012-01-16 11:07:41

回答

3

你將不得不提供的+重載版本這需要int和類complex對象作爲輸入參數。這個函數應該是一個非成員函數。

complex operator+(int i, complex object) 

注意,此外,如果您要訪問此重載函數內部protectedprivate成員那麼它將不得不作出的complexfriend

這是用於運算符重載的自由函數強度與成員函數運算符重載相比的一個特例。

+0

是的,這是有效的。謝謝 – ZoomIn 2012-01-16 11:19:11

+0

由於存在從'int'到'c​​omplex'的轉換,因此具有這樣的過載將是相當重要的。通常的解決方案是使'operator +(UDT,UDT)'成爲一個自由函數,而不是爲可以轉換爲UDT的所有類型添加重載。 – 2012-01-16 13:21:45

+0

@LucTouraille:我不會推薦隱式轉換構造函數,原因很簡單,我不希望隱式轉換造成嚴重破壞。相信我,他們做的。另外,OP有一個轉換構造函數,這可能並非總是如此。 – 2012-01-16 13:51:24

0

定義一個函數任何類外:

complex operator + (int lhs, complex rhs) { /* ... */ } 

確保編譯器可以看到它,你可以添加到整數配合你的心臟的內容。你可能還想用另一種方式來使用參數。

2

這就是爲什麼operator+通常被定義爲一個自由函數的原因:不是有complex complex::operator+(complex object),你可以(應該)定義了一個免費的功能

complex operator+(const & complex lhs, const & complex rhs) 
{ 
    return complex(lhs.i + rhs.i, lhs.j + rhs.j); 
    // You will need some way to access i and j, either by making this function 
    // a friend of complex or by providing getters 
} 

這樣,線obj3 = i + obj3將等同於operator+(i, obj3);由於您寫的構造函數可以將整數轉換爲複合體,因此該調用將成功完成並與以下代碼相同:operator+(complex(i), obj3)

作爲一個經驗法則,當左手邊和右手邊大小具有同等重要性時,您應該比成員函數更喜歡自由函數來重載二元運算符。這樣,你知道如果a op b工作,然後b op a也可以工作。

在旁註上,您還應該更喜歡將參數作爲reference-to-const傳遞,並且在成員函數爲const時將其標記爲const(例如樣例中的operator+display)。

相關問題