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. 如何立刻读取在MySQL中自动生成的主键

    在写一个接口时,我们需要对两个表分别动刀,但是我们需要前一个表的主键作为下一个表的功能外键, 如果使用mybatisplus,insert完成之后便可以直接在对象中取出这个id值 如果使用mybati ...

  2. python与c/java的异

    1.注释 #为单行注释 """ 这里是多行注释 """ ''' 这个也可以是多行注释 ''' 2.赋值 在python中赋值不需要特定变量的 ...

  3. 一键语法错误增强工具 ChineseErrorCorrector

    一键语法错误增强工具 欢迎使用我最近开源的使用一键语法错误增强工具,该工具可以进行14种语法错误的增强,不同行业可以根据自己的数据进行错误替换,来训练自己的语法和拼写模型,希望推动行业文本纠错的发展, ...

  4. docker 容器卷

    创建各种卷 [root@docker ~]# docker volume create mqy-vo101 mqy-vo101 [root@docker ~]# docker inspect mqy- ...

  5. 如何使用二阶优化算法实现对神经网络的优化 —— 分布式计算的近似二阶优化算法实现对神经网络的优化 —— 《Distributed Hessian-Free Optimization for Deep Neural Network》

    论文: <Distributed Hessian-Free Optimization for Deep Neural Network> 地址: https://arxiv.org/abs/ ...

  6. MPI经典课程视频 —— 中国科学技术大学-并行计算(国家级精品课) —— 陈国良院士的06年课程

    课程视频地址: https://www.bilibili.com/video/BV1U7411N78e

  7. 作为电脑屏幕的补光灯,到底是应该选Led灯还是荧光灯

    现在的台灯灯具市场基本被Led灯给霸占,这就无形之中要大家买台灯的时候只能选择Led等,我也是如此,手上有一款20年前上高中时候的"孩视宝"荧光灯的台灯,然后还有一款刚刚购入的Le ...

  8. ComfyUI插件:efficiency-nodes-comfyui节点

    前言: 学习ComfyUI是一场持久战, efficiency-nodes-comfyui是提高工作流创造效率的工具,包含效率节点整合工作流中的基础功能,比如Efficient Loader节点相当于 ...

  9. 最短小精悍的js数组打乱顺序

          let number = [1, 45, 13, 17];       // 封装一个打乱数组的方法       function getarr(arr) {         return ...

  10. 关于Mongodb索引创建的一些体会

    mongodb索引分类以及创建我就不多说了,如果想了解可以直接在百度上搜索,这里我说一下关于索引创建的个人想法. 1.优先给一些Id类字段添加索引,查询时可以缩小扫描范围. 2.创建联合索引时,索引字 ...