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

时间:2013-12-15 21:00:35

标签: c++ int operators

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

 TimeKeeper& operator++() {
        d_seconds++;
        return *this;
  }
  const TimeKeeper operator++(int) {
        TimeKeeper tk(*this);
        ++(*this);
        return tk;
  }

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

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

3 个答案:

答案 0 :(得分:5)

operator++() preincrement 运算符(++x),而operator++(int) post increment 运算符(x++ })。如果您了解 这些操作的工作原理,那么您应该能够解释为什么其中一个必须返回副本。

举一个简单的例子:

int x = 1;

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

2发生了什么?

x表达式中2的值变为x++1被打印(增量操作前x的值)。< / p>

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

答案 1 :(得分:4)

没有额外int的那个是preincrement运算符,而带有额外int参数的那个是post增量运算符。这种有点笨拙的符号在某种程度上是一种区分两种符号的方法,int不能用于任何有用的目的:

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

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

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

答案 2 :(得分:0)

要区分这两个运算符,必​​须存在一些语法差异。因此,为了区分postincrement运算符和preincrement运算符,将未使用的int类型的参数添加到postincrement运算符的声明中。 preincrement操作符返回对象本身。这就是为什么它的返回类型是一个引用。 postincrement运算符返回一个临时对象并递增原始对象。这是它返回一个值的方式。