`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 ...
随机推荐
- P9058 [Ynoi2004] rpmtdq 与 P9678 [ICPC2022 Jinan R] Tree Distance
思路: 注意到点对数量有 \(N^2\) 个,考虑丢掉一些无用的点对. 对于点对 \((x_1,y_1),(x_2,y_2)\),满足 \(x_1 \le x_2 < y_2 \le y_1\) ...
- LLM并行训练7-混合并行总结
概述 根据前面的系列文章, 对预训练大模型里用到的主要并行加速技术做了一系列拆分分析. 但是在实际的训练里往往是多种并行混合训练. 我们要怎么配置这些并行策略才能让训练框架尽可能的减少通信瓶颈, 提升 ...
- 我用Awesome-Graphs看论文:解读PowerGraph
PowerGraph论文:<PowerGraph: Distributed Graph-Parallel Computation on Natural Graphs> 上次通过文章< ...
- 一个基于 SourceGenerator 生成 从 dbReader转换为 class 数据的性能测试实验
好奇 SourceGenerator 出现开始,好几年了,虽然一直好奇用SourceGenerator 生成代码 与 emit 等动态生成的代码会有多少差距, 但是一直特别懒,不想搞 其实 dappe ...
- 【H5】11 表格
概述: 在HTML中一个很普通的任务是构建表格数据,有大量的元素和属性是来满足这种需求的. 只需要一点儿的CSS来设定风格,HTML让在web上显示表格数据变的很容易,例如你的学校的教学计划,你当地的 ...
- 【Java】API SecureRandom 安全随机
之前学习的Random工具类只是一个伪随机数类... @Test public void secureRandom() throws Exception { // 个不可预测的安全的随机数 // 无法 ...
- 全地形人形机器人(humanoid)是否只能进行短距视野感知呢 —— 实时地形感知
相关: https://capital.lenovo.com/news/detail/id/924/s/1.html 常见的人形机器人都是测试其手臂灵活度为主,但是近日看到一款以全地形步态行走为主的机 ...
- jax框架的官方编译版本 —— 预编译发行版本(release 列表)
jax框架的Google官方给出的预编译版本,支持CUDA和CUDNN的,带有python版本号,CUDA版本号,CUDNN版本号的: https://storage.googleapis.com/j ...
- SpringBoot 整合线程池
分为三步 启动类加 @EnableAsync 注解 在方法上加 @Async 注解 创建线程池配置类 1.启动类加 @EnableAsync 注解 @SpringBootApplication @En ...
- .NET 高效开发Nuget管理工具(开源)
我们.NET开发会引用很多外部Nuget包,多项目.多个解决方案.甚至多个仓库. 简单的Nuget包管理,通过VS就能比较简单处理好.但复杂的场景呢,比如: 1.一个仓库里,有多个解决方案的Nuget ...