我从老师制作的程序中获得了这些代码:
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)返回一个值,解释原因?"
任何人都可以向我解释这个吗?如果你需要剩下的代码我不介意穿上它!谢谢!!
没有额外参数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++!
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
成为2
在x++
表达,1
印刷(的值x
之前的增量操作).
在第二条语句,的值x
变为3
在++x
表达.