2017-02-16 64 views
0

我已經使用好友函數重載了預增加運算符。在重載的朋友函數中,變量的值顯示正確。但是,顯示功能中沒有顯示該值,爲什麼?超載預增加運算符不顯示正確結果

#include <iostream> 
using namespace std; 

class Rectangle { 
public: 
    int breadth; 

public: 
    void read(); 
    void display(); 
    friend void operator ++(Rectangle r1); 
}; 
void Rectangle::read() 
{ 
    cout << "Enter the breadth of the Rectangle: "; 
    cin >> breadth; 
} 
void operator++(Rectangle r1) 
{ 
    ++r1.breadth; 
    cout<<r1.breadth<<endl; //correct result 
} 
void Rectangle::display() 
{ 
    cout<<breadth<<endl; // not showing pre-incremented value, why ??? 
} 
int main() 
{ 
    cout<<"Unary Operator using Friend Function \n"; 
    Rectangle r1; 
    r1.read(); 
    ++r1; 
    cout << "\n breadth of Rectangle after increment: "; 
    r1.display(); 
    return 0; 
} 
+1

什麼是「矩形r1」 - 基於您傳入的指針,引用或複製對象? – UKMonkey

+1

因爲你的++運算符是一個非成員函數並增加了它自己的矩形副本。 – tambre

+3

您應該將++運算符實現爲成員函數。 – tambre

回答

8

operator ++採用由值Rectangle對象,這意味着它接收複製其操作數的。然後它會盡職地增加副本的breadth成員,將其打印出來,然後在副本結束時丟棄副本。

你會想引用採取參數:

friend void operator ++(Rectangle &r1) 
{ 
    ++r1.breadth; 
} 

另外請注意,這是很常見的重載使用成員函數元運算符,而不是免費的功能。使用這樣的,你不會有這樣的問題:

class Rectangle 
{ 
    // ... 

public: 
    void operator++() 
    { 
    ++breadth; 
    } 

    // ... 
}; 

幾方意見:

  • 是很常見的operator++一個參考返回其操作數,模仿什麼內置運營商做。就像可能爲int i執行++ ++ i一樣,對於用戶定義類型r也應該可以執行++ ++ r

  • 實踐中,運算符重載只能在以下情況下使用:a)您正在編寫一種類似於內置類型的類型,或者b)您正在編寫一個特定於域的語言。遞增一個矩形並不是我可以直觀地解釋的,並且最好是作爲一個指定的成員函數來完成。你怎麼知道++r是增加寬度還是高度,還是兩者,或者將矩形向右移動,還是......?

+0

您還應該顯示將增量超載作爲成員函數的解決方案。 – tambre

+0

@tambre如果你想展示如何做對,你可以參考[關於運算符重載的FAQ條目](http://stackoverflow.com/questions/4421706/operator-overloading)。 – moooeeeep

+2

最後一個要點*非常重要。這是一個非常糟糕的使用操作超載。 (幸運的是,這是一個教師的例子問題的可憐的選擇)。 –