我从老师制作的程序中获得了这些代码:
TimeKeeper& operator++() {
d_seconds++;
return *this;
}
const TimeKeeper operator++(int) {
TimeKeeper tk(*this);
++(*this);
return tk;
}
我老师问我们的一个问题是“operator ++()返回一个引用,而operator ++(int)返回一个值,解释原因?”
任何人都可以向我解释这个吗? 如果你需要剩下的代码我不介意穿上它! 谢谢!
答案 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运算符返回一个临时对象并递增原始对象。这是它返回一个值的方式。