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;
}

解释:

  1. 前置自增 (++c):

    • 首先调用 operator++(),该函数立即将 value 自增,然后返回自增后的对象引用。因此,输出显示的是自增后的值。
  2. 后置自增 (c++):

    • 调用 operator++(int) 时,先创建一个临时对象 temp,保存自增前的状态,然后将 value 自增,最后返回自增前的那个临时对象。这就是为什么 c++ 操作返回的是自增前的值。

区别总结:

  • 前置自增 (operator++()): 先自增再返回,通常更高效,尤其是对于复杂对象。
  • 后置自增 (operator++(int)): 先返回原始值,再自增,需要创建临时对象,因此稍微低效。

`operator++(int)` 和 `operator++()`的更多相关文章

  1. VS2013 error C2556: “const int &Array<int>::operator [](int)”: 重载函数与“int &Array<int>::operator [](int)”只是在返回类型上不同

    1,VS2013 错误 1 error C2556: “const int &Array<int>::operator [](int)”: 重载函数与“int &Array ...

  2. operator++()和operator++(int)的区别

    很久以前(八十年代),没有办法区分++和--操作符的前缀与后缀调用.这个问题遭到程序员的报怨,于是C++语言得到了扩展,允许重载increment 和 decrement操作符的两种形式. 然而有一个 ...

  3. error C2556: 'const char &MyString::operator [](int)' : overloaded function differs only by return type from 'char &MyString::operator [](int)'

    char & operator[](int i);const char & operator[](int i);/*const char & operator(int i);* ...

  4. 从零开始学C++之重载 operator new 和 operator delete 实现一个简单内存泄漏跟踪器

    先来说下实现思路:可以实现一个Trace类,调用 operator new 的时候就将指向分配内存的指针.当前文件.当前行等信息添加进Trace 成员map容器内,在调用operator delete ...

  5. operator new和operator delete

    从STL源码剖析中看到了operator new的使用 template<class T> inline void _deallocate(T* buffer) { ::operator ...

  6. 定制自己的new和delete:operator new 和 operator delete

    new和delete不同用法 基本用法 int * aptr = new int(10); delete aptr, aptr = nullptr; 上面的代码是我们最基本也是最常见的使用new和de ...

  7. C++面向对象高级编程(九)Reference与重载operator new和operator delete

    摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一 Reference 引用:之前提及过,他的主要作用就是取别名,与指针很相似,实现也是基于指针. 1.引用必须有初值,且不能引用nul ...

  8. operator new 和 operator delete 实现一个简单内存泄漏跟踪器

    先来说下实现思路:可以实现一个Trace类,调用 operator new 的时候就将指向分配内存的指针.当前文件.当前行等信息添加进Trace 成员map容器内,在调用operator delete ...

  9. 类型转换运算符、*运算符重载、->运算符重载、operator new 和 operator delete

    一.类型转换运算符 必须是成员函数,不能是友元函数 没有参数 不能指定返回类型 函数原型:operator 类型名();  C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 1 ...

  10. ZT 自定义operator new与operator delete的使用(1)

    http://blog.csdn.net/waken_ma/article/details/4004972 先转两篇文章: 拨开自定义operator new与operator delete的迷雾 C ...

随机推荐

  1. 【教程】重启Windows文件资源管理器

    [教程]重启Windows文件资源管理器 打开任务管理器 以下方法任选其一: 方法一 :组合键 Ctrl + Shift + ESC (个人推荐) 方法二 :组合键 Win + X (或右键Windo ...

  2. docker 6.1测试

    https://www.cnblogs.com/xiugeng/p/10193333.html#_label1 1.设置重启策略 [root@docker ~]# cat /etc/docker/da ...

  3. python统计班级学生

    python统计班级学生 如下场景: 假设我有一个学生类和一个班级类,想要实现的功能为:    执行班级人数增加的操作.获得班级的总人数:    学生类继承自班级类,每实例化一个学生,班级人数都能增加 ...

  4. 14、Spring之基于注解的声明式事务

    14.1.概述 14.1.1.编程式事务 事务功能的相关操作全部通过自己编写代码来实现: Connection conn = ...; try { // 开启事务:关闭事务的自动提交 conn.set ...

  5. 【MySQL】30 备份与恢复

    1.备份命令: mysqldump -u用户名 -p 密码 -h 服务主机IP -P 端口号 \ 数据库名称 \ > 指定备份的sql脚本文件位置 ↓ # 文件位置样例: # C:\Users\ ...

  6. 【Layui】08 时间线 Timeline

    文档地址: https://www.layui.com/demo/timeline.html 常规时间线: <ul class="layui-timeline"> &l ...

  7. pytorch-a2c-ppo-acktr-gail 算法代码

    地址: https://github.com/ikostrikov/pytorch-a2c-ppo-acktr-gail

  8. 网友开放的开源项目:网页版的A*算法可视化演示程序

    相关项目: https://xueqiaoxu.me/#projects 项目介绍: A JavaScript path-finding library for grid based games. I ...

  9. python版本的“共轭梯度法”算法代码

    在看代码的过程中遇到了共轭梯度法这个概念,对这个算法的数学解释看过几遍,推导看过了,感觉懂了,然后过上一些日子就又忘记了,然后又看了一遍推导,然后过了一些日子也就又忘记了,最后想想这个算法的数学解释就 ...

  10. python绘图库matplotlib:刻度线的方向调整, in, out, inout

    前文相关: python绘图库matplotlib:画线的标志marker的设置--类型/size/空心/边线颜色及大小/显示marker超出边界部分 由于工作需要经常用matplotlib来绘图,但 ...