2017-10-20 20 views
0

我想添加兩個對象。當我在運算符重載中傳遞兩個參數時,它給了我一個錯誤,即必須有零個或一個參數。我想知道爲什麼我不能將兩個對象作爲參數傳遞以添加它們。在運算符重載中傳遞參數號時出錯?

class Rectangle 
{ 
private: 
    int L; 
    int B; 

public: 

    Rectangle() //default constructor 
    { 
     L = 2; 
     B = 2; 
    } 

    Rectangle(int l,int b)  //parametrized constructor 
    { 
     L = l; 
     B = b; 
    } 

    Rectangle operator+ (Rectangle obj1,Rectangle obj2) //operator overloading 
    { 
     Rectangle obj3 

     obj3.L = obj1.L + obj2.L; 
     obj3.B = obj1.B + obj2.B; 
     return obj3 
    } 

    void Display() 
    { 
     cout<< "length is " << L <<endl; 
     cout<< "breadth is " << B <<endl; 
    } 


}; 

int main() 
{ 
    Rectangle R1; 
    R1.Display(); 

    Rectangle R2(5,3); 
    R2.Display(); 

    //Rectangle R3; 
    //R3 = R1 + R2; 
    //R3.Display(); 

    return 0; 
} 
+2

如果它是一個成員函數,那麼對象本身會有一個自動的額外參數('* this')。 –

+1

在構造函數中使用初始化列表 –

+2

並閱讀有關const引用。對操作符更好並保存複製 –

回答

2

像加法這樣的二元運算符需要2個操作數。重載這樣的運算符意味着重載的方法也可以在2個操作數上運行。您只需提供1個參數的原因是,其中的範圍是您宣佈您的超載,即Rectangle類中的。基本上,由於過載功能是Rectangle類的一個成員,左手側操作者將被認爲是本,對象本身的實例。因此,您只需要提供右側的操作符作爲參數。

申報你心目中的功能將重載加法運算Rectangle類的範圍之外的另一種方式。然後,你將不得不提供這兩個操作數。但在這種情況下,你應該介意封裝。 (即找出一種方法來構造所產生的Rectangle實例,而不只訪問Rectangle類的公共成員)這樣的考慮封裝就是爲什麼運營商通常爲成員函數實現的原因之一,儘管傳遞參數似乎直覺的人他最近開始學習面向對象的編程語言。

但這是相當的運算符重載的基本信息,我相信你應該更多的超載讀了,特別是通過對成員函數如何重載運營商影響超載過程。

1

在上面的代碼,operator+是一個成員函數。在其聲明中有兩個命名的參數;它也有一個隱含的this指針,因爲它是一個成員函數。這有三個論點。編譯器說operator+應該只有一個或兩個參數。這是因爲+有兩種可能的形式,一種是一元和一種二元。也就是說,你可以寫+2,它使用一元加號,或者你可以寫2+2,它使用二進制加。

這可以通過兩種不同的方式解決。一個是使其成爲static成員函數;不需要this指針,因此具有兩個命名參數的靜態operator+實際上有兩個參數。

一個更好的辦法是讓一個非成員函數。將其移出類定義,並修復分配給obj3的數據成員的錯誤。 Rectangle有一個構造函數,它有兩個參數;用它。您還必須添加一種方法來獲取這兩個值,而不管您如何實現這個特定的功能。所以它看起來像這樣:

Rectangle operator+(Rectangle obj1, Rectangle obj2) { 
    Rectangle obj3(obj1.getL() + obj2.getL(), obj1.getR() + obj2.getR()); 
    return obj3; 
    } 

一個更普遍的方法是提供operator+=(Rectangle obj),作爲一個成員函數:

void operator+=(Rectangle obj) { 
    L += obj.L; 
    R += obj.R; 
} 

,並用它來實現非會員operator+

Rectangle operator+(Rectangle obj1, Rectangle obj2) { 
    obj1 += obj2; 
    return obj1; 
}