繁体   English   中英

重载前增量和后增量

[英]overloading pre-increment and post-increment

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

T& T ::operator++()

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

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

我有两个问题:

1)“旧”是什么意思?

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

“旧”是什么意思?

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM