當我找到的所有代碼顯示在重載前綴運算符時返回一個引用變量時,我感到困惑。我瀏覽了parashift.com常見問題解答(http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.14),但它並不清楚,即使它表示它會清楚當你讀它。我將他們的例子改編成一個無意義的,毫無意義的小程序來測試。前綴重載的C++返回引用變量
#include<iostream>
using namespace std;
class Number {
public:
Number& operator++(); // prefix ++
Number operator++ (int); // postfix ++
int value() { return value_; }
void setValue(int value) { value_ = value; }
private:
int value_;
};
Number& Number::operator++() {
++value_;
return *this;
}
Number Number::operator++ (int unused) {
Number temp;
temp.setValue(value_);
++value_;
return temp;
}
int main()
{
Number someNum;
someNum.setValue(20);
cout << "someNum : " << someNum.value() << "\n";
someNum++;
++someNum;
cout << "someNum : " << someNum.value() << "\n";
return 0;
}
的問題是,如果我只是宣佈它作爲一個Number對象以及像這樣它的工作原理:
#include<iostream>
using namespace std;
class Number {
public:
Number operator++(); // prefix ++
Number operator++ (int); // postfix ++
int value() { return value_; }
void setValue(int value) { value_ = value; }
private:
int value_;
};
Number Number::operator++() {
++value_;
return *this;
}
Number Number::operator++ (int unused) {
Number temp;
temp.setValue(value_);
++value_;
return temp;
}
int main()
{
Number someNum;
someNum.setValue(20);
cout << "someNum : " << someNum.value() << "\n";
someNum++;
++someNum;
cout << "someNum : " << someNum.value() << "\n";
return 0;
}
我想我只是需要更好地瞭解參考變量。任何人都可以解釋爲什麼前綴運算符應該編碼爲返回引用變量?
因此,如果將其與(+)((someNum ++)++)+ ++也只增加someNum一次性後增量進行比較,則第二種更合適!所以如果從這邊看,返回一個副本會更好,因爲post和pre increment操作符的語義是可比的! – mmmmmmmm
@RüdigerStevens:不是。按照定義,後增加必須返回一個臨時值,因爲返回的對象和原始對象將具有不同的值。但是在預增加的情況下,返回對象和原始對象將具有相同的值;因此在預增加運算符中創建一個臨時變量並返回它是沒有意義的。 – Nawaz
描述很好...鏈接已死。 :) –