operator ++()和operator ++(int)有什么区别?

use*_*560 4 c++ int operators

我从老师制作的程序中获得了这些代码:

 TimeKeeper& operator++() {
        d_seconds++;
        return *this;
  }
  const TimeKeeper operator++(int) {
        TimeKeeper tk(*this);
        ++(*this);
        return tk;
  }
Run Code Online (Sandbox Code Playgroud)

我的老师问我们的一个问题是"operator ++()返回一个引用,而operator ++(int)返回一个值,解释原因?"

任何人都可以向我解释这个吗?如果你需要剩下的代码我不介意穿上它!谢谢!!

Die*_*ühl 7

没有额外参数int的为前自增运算符,而带有额外int参数的为后自增运算符。这种有点尴尬的符号有点像是一种区分这两种符号的黑客手段,并且int不能用于任何有用的目的:

TimeKeeper keeper;
++keeper; // pre increment: calls TimeKeeper::operator++()
keeper++; // post increment: calls TimeKeeper::operator++(int)
Run Code Online (Sandbox Code Playgroud)

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

keeper++在上面的代码片段中,未使用结果:您应该仅在使用其结果时使用后增量运算符。否则,它只会浪费按照老师的代码创建一个临时对象,然后将其丢弃。即使构造很便宜,也可能会浪费几个 CPU 周期。除非必要,否则不使用它的相同重载和推理也适用于减量运算符operator--()。奇怪的是,C++不是惯用的 C++!


Cha*_*had 5

operator++()前递增运算符(++x),同时operator++(int)后递增运算符(x++).如果您了解如何这些操作的工作,那么你应该能够解释为什么他们中的一个必须返回一个副本.

举一个简单的例子:

int x = 1;

std::cout << x++ << "\n";  // prints 1
std::cout << ++x << "\n";  // prints 3
Run Code Online (Sandbox Code Playgroud)

发生什么事了2

的值x成为2x++表达,1印刷(的值x之前的增量操作).

在第二条语句,的值x变为3++x表达.

  • 但这并不能解释为什么,这是问题的关键部分。 (2认同)