当我找到的所有代码显示在重载前缀运算符时返回一个引用变量时,我感到困惑。我浏览了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
描述很好...链接已死。 :) –