重载前增量和后增量

时间:2011-10-13 01:37:11

标签: c++ operator-overloading

我看到了一个关于实现预增量和后增量的示例,声称可以将重载预增量定义为

T& T ::operator++()

和过载后增量可以按照预增量来定义和实现,如下所示

const T T::operator++(int){
  const T old(*this);
  ++(*this);
  return old;
}

我有两个问题:

1)“旧”是什么意思?

2)假设++(* this)使用预增量,而原始预增量定义没有参数。但是,这里有*。

4 个答案:

答案 0 :(得分:2)

  

“旧”是什么意思?

该方法是后增量。返回当前值(“旧值”),然后递增值(“新值”)。

  假设++(* this)使用预增量,而原始预增量定义没有参数。但是,这里有*。

*this不是一个论点。括号不是必需的,它们是为了便于阅读 它相当于++*this

答案 1 :(得分:2)

1)“old”是“this”在递增之前所具有的值。后增量应该返回该值。

2)++(* this)相当于this-> operator ++()

答案 2 :(得分:2)

  

2)++(* this)被假定使用预增量和原始   预增量定义没有参数。但是,它有*这个   这里。

++是一元运算符,所以它有一个参数可以。每当您将运算符作为成员函数重载时,第一个参数就是当前对象。

未使用的int参数只是区分增量前和后增量的黑客,因为operator++可能意味着。后增量并不真正接受整数*,它只是一种(笨拙的)语言构造。

您还可以将这些运算符重载为自由函数:

struct T
{
    int n;
};

T& operator++(T& t) { ++t.n; return t; }
T operator++(T& t, int) { T old(t); ++t; return old; }

int main()
{
   T a;
   T b = a++;
   ++b;
}

*正常使用情况下。使用函数调用语法调用运算符时,可以传递一个额外的int来区分这两者:

operator++(a); //calls-preincrement
operator++(b, 1); //calls post-increment

答案 3 :(得分:1)

old只是一个变量名(它不是关键字,如果这是你想知道的)。它用于保存操作数的先前值。