C++在前缀重载中返回引用变量

use*_*219 1 c++ overloading reference prefix

当我找到的所有代码显示在重载前缀运算符时返回引用变量时,我感到困惑.我浏览了parashift.com常见问题解答(http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.14)并不清楚,尽管它说它会很清楚当你读它.我把他们的例子改编成了一个荒谬的,毫无意义的小程序来测试.

#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;
}
Run Code Online (Sandbox Code Playgroud)

问题是,如果我只是将它声明为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;
}
Run Code Online (Sandbox Code Playgroud)

我假设我只需要更好地理解参考变量.任何人都可以解释为什么前缀运算符应该编码为返回引用变量?

Naw*_*waz 5

和...之间的不同 :

Number& Number::operator++ () {
   ++value_;
   return *this;
}
Run Code Online (Sandbox Code Playgroud)

Number Number::operator++ () {
   ++value_;
   return *this;
}
Run Code Online (Sandbox Code Playgroud)

是,当您使用第一个代码时,以下表达式:

++(++(++someNum)); 
Run Code Online (Sandbox Code Playgroud)

增加someNumTHRICE.请参阅此处的输出:http://ideone.com/y9UlY

但是,当你使用第二个时,这个

++(++(++someNum));
Run Code Online (Sandbox Code Playgroud)

someNum只是增加!! 请参阅此处的输出:http://ideone.com/eOLdj

这是因为当你从中返回引用时operator++(),第二个和第三个++对所调用的同一个对象进行调用someNum,因此它会一直递增同一个对象.但是当您按值返回时,第二个和第三个++将对您返回的临时对象进行调用operator++().因此,第二次和第三次调用不会增加someNum,而是增加在表达式结尾处被销毁的临时对象.

现在,如果临时对象被破坏,为什么要在第一时间创建呢?毕竟,它的预增量运算符,意味着临时对象和原始对象将具有相同的值.因此,良好的设计决策是,在定义预增量运算符时通过引用返回,以避免创建临时,并提高性能.