关于c ++:operator ++()和operator ++(int)有什么区别?

What is the difference between operator++ () and operator++ (int)?

本问题已经有最佳答案,请猛点这里访问。

我有我老师编写的程序中的这些行代码:

1
2
3
4
5
6
7
8
9
 TimeKeeper& operator++() {
        d_seconds++;
        return *this;
  }
  const TimeKeeper operator++(int) {
        TimeKeeper tk(*this);
        ++(*this);
        return tk;
  }

老师问我们的一个问题是:"operator++()返回一个引用,operator++(int)返回一个值,解释为什么?"

有人能给我解释一下吗??如果你需要剩下的代码,我不介意放在上面!谢谢!!


operator++()是预增量算子(++x),operator++(int)是后增量算子(x++)。如果您了解这些操作的工作原理,那么您应该能够解释为什么其中一个操作必须返回一个副本。

举个简单的例子:

1
2
3
4
5
6
int x = 1;

std::cout << x++ <<"
"
;  // prints 1
std::cout << ++x <<"
"
;  // prints 3

2发生了什么?

x的值在x++的表达式中变成2,打印1(增量操作前x的值)。

在第二个语句中,x的值在++x表达式中变为3


不带额外int的是预增量运算符,带额外int参数的是后增量运算符。这种有点笨拙的符号在某种程度上是用来区分这两种符号的一种黑客手段,而int不能用于任何有用的目的:

1
2
3
TimeKeeper keeper;
++keeper; // pre increment: calls TimeKeeper::operator++()
keeper++; // post increment: calls TimeKeeper::operator++(int)

预增量和后增量的区别在于,对于预增量,表达式的值在增量之后,而对于后增量,表达式的值在表达式之前。对于后增量,将应用增量的对象向前移动,而另一个对象表示返回增量之前的状态。表示前一状态的对象是一个临时对象,它只存在于表达式中,因此需要按值返回。对于预增量,只涉及一个值,可以通过引用立即返回该值。

在上面的代码片段中,没有使用来自keeper++的结果:在使用结果时,应该只使用后递增运算符。否则,它只会浪费大量的时间沿着老师的代码创建一个临时对象,然后被丢弃。即使构建成本低,也可能会浪费几个CPU周期。除非必要,否则不使用它的重载和推理同样适用于递减运算符operator--()。奇怪的是,EDCOX1,18,因此不是惯用的C++!


要区分这两个运算符,必须有一些语法差异。为了区分后增量运算符和预增量运算符,在后增量运算符的声明中添加了一个类型为int但未使用的参数。preincrement运算符返回对象本身。这就是它的返回类型A引用的原因。postIncrement运算符返回临时对象并递增原始对象。这就是它返回值的方式。