operator++(int)
和 operator++()
是 C++ 中重载的两个不同的自增运算符函数,它们分别用于后置自增和前置自增。它们的区别在于调用方式以及自增行为的不同。
1. 前置自增运算符 operator++()
:
- 函数签名:
Type& operator++();
- 调用方式:
++object;
- 作用: 前置自增运算符首先将对象自增,然后返回自增后的对象本身(通常返回为引用类型,
Type&
),因此你可以直接在同一个表达式中使用自增后的值。 - 特点: 前置自增更高效,因为它不需要创建临时对象。
2. 后置自增运算符 operator++(int)
:
- 函数签名:
Type operator++(int);
- 调用方式:
object++;
- 作用: 后置自增运算符会先返回对象的原始状态,然后再进行自增。参数
int
并不是用来传递值的,它只是用来区分后置和前置运算符,因此它不需要实际传递参数。 - 特点: 后置自增通常会创建一个临时对象,保存自增前的值,然后再返回这个临时对象。这使得后置自增比前置自增稍微低效一些,因为涉及到对象的拷贝。
具体的示例代码:
#include <iostream>
class Counter {
private:
int value;
public:
Counter(int v) : value(v) {}
// 前置自增运算符
Counter& operator++() {
++value; // 先自增
return *this; // 返回自增后的对象
}
// 后置自增运算符
Counter operator++(int) {
Counter temp = *this; // 保存当前状态
++value; // 自增
return temp; // 返回自增前的对象
}
int getValue() const {
return value;
}
};
int main() {
Counter c(5);
// 前置自增
++c; // 先自增,再返回
std::cout << "After ++c: " << c.getValue() << std::endl; // 输出6
// 后置自增
c++; // 先返回,再自增
std::cout << "After c++: " << c.getValue() << std::endl; // 输出7
return 0;
}
解释:
-
前置自增 (
++c
):- 首先调用
operator++()
,该函数立即将value
自增,然后返回自增后的对象引用。因此,输出显示的是自增后的值。
- 首先调用
-
后置自增 (
c++
):- 调用
operator++(int)
时,先创建一个临时对象temp
,保存自增前的状态,然后将value
自增,最后返回自增前的那个临时对象。这就是为什么c++
操作返回的是自增前的值。
- 调用
区别总结:
- 前置自增 (
operator++()
): 先自增再返回,通常更高效,尤其是对于复杂对象。 - 后置自增 (
operator++(int)
): 先返回原始值,再自增,需要创建临时对象,因此稍微低效。