`operator++(int)` 和 `operator++()`
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)): 先返回原始值,再自增,需要创建临时对象,因此稍微低效。
`operator++(int)` 和 `operator++()`的更多相关文章
- 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 ...
- operator++()和operator++(int)的区别
很久以前(八十年代),没有办法区分++和--操作符的前缀与后缀调用.这个问题遭到程序员的报怨,于是C++语言得到了扩展,允许重载increment 和 decrement操作符的两种形式. 然而有一个 ...
- 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);* ...
- 从零开始学C++之重载 operator new 和 operator delete 实现一个简单内存泄漏跟踪器
先来说下实现思路:可以实现一个Trace类,调用 operator new 的时候就将指向分配内存的指针.当前文件.当前行等信息添加进Trace 成员map容器内,在调用operator delete ...
- operator new和operator delete
从STL源码剖析中看到了operator new的使用 template<class T> inline void _deallocate(T* buffer) { ::operator ...
- 定制自己的new和delete:operator new 和 operator delete
new和delete不同用法 基本用法 int * aptr = new int(10); delete aptr, aptr = nullptr; 上面的代码是我们最基本也是最常见的使用new和de ...
- C++面向对象高级编程(九)Reference与重载operator new和operator delete
摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一 Reference 引用:之前提及过,他的主要作用就是取别名,与指针很相似,实现也是基于指针. 1.引用必须有初值,且不能引用nul ...
- operator new 和 operator delete 实现一个简单内存泄漏跟踪器
先来说下实现思路:可以实现一个Trace类,调用 operator new 的时候就将指向分配内存的指针.当前文件.当前行等信息添加进Trace 成员map容器内,在调用operator delete ...
- 类型转换运算符、*运算符重载、->运算符重载、operator new 和 operator delete
一.类型转换运算符 必须是成员函数,不能是友元函数 没有参数 不能指定返回类型 函数原型:operator 类型名(); C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 1 ...
- ZT 自定义operator new与operator delete的使用(1)
http://blog.csdn.net/waken_ma/article/details/4004972 先转两篇文章: 拨开自定义operator new与operator delete的迷雾 C ...
随机推荐
- 【教程】重启Windows文件资源管理器
[教程]重启Windows文件资源管理器 打开任务管理器 以下方法任选其一: 方法一 :组合键 Ctrl + Shift + ESC (个人推荐) 方法二 :组合键 Win + X (或右键Windo ...
- docker 6.1测试
https://www.cnblogs.com/xiugeng/p/10193333.html#_label1 1.设置重启策略 [root@docker ~]# cat /etc/docker/da ...
- python统计班级学生
python统计班级学生 如下场景: 假设我有一个学生类和一个班级类,想要实现的功能为: 执行班级人数增加的操作.获得班级的总人数: 学生类继承自班级类,每实例化一个学生,班级人数都能增加 ...
- 14、Spring之基于注解的声明式事务
14.1.概述 14.1.1.编程式事务 事务功能的相关操作全部通过自己编写代码来实现: Connection conn = ...; try { // 开启事务:关闭事务的自动提交 conn.set ...
- 【MySQL】30 备份与恢复
1.备份命令: mysqldump -u用户名 -p 密码 -h 服务主机IP -P 端口号 \ 数据库名称 \ > 指定备份的sql脚本文件位置 ↓ # 文件位置样例: # C:\Users\ ...
- 【Layui】08 时间线 Timeline
文档地址: https://www.layui.com/demo/timeline.html 常规时间线: <ul class="layui-timeline"> &l ...
- pytorch-a2c-ppo-acktr-gail 算法代码
地址: https://github.com/ikostrikov/pytorch-a2c-ppo-acktr-gail
- 网友开放的开源项目:网页版的A*算法可视化演示程序
相关项目: https://xueqiaoxu.me/#projects 项目介绍: A JavaScript path-finding library for grid based games. I ...
- python版本的“共轭梯度法”算法代码
在看代码的过程中遇到了共轭梯度法这个概念,对这个算法的数学解释看过几遍,推导看过了,感觉懂了,然后过上一些日子就又忘记了,然后又看了一遍推导,然后过了一些日子也就又忘记了,最后想想这个算法的数学解释就 ...
- python绘图库matplotlib:刻度线的方向调整, in, out, inout
前文相关: python绘图库matplotlib:画线的标志marker的设置--类型/size/空心/边线颜色及大小/显示marker超出边界部分 由于工作需要经常用matplotlib来绘图,但 ...