c++ 前置++与后置++的区别

C++中前置++和后置++的详细讲解 前置++与后置++区别 阅读详情
用C++编程的都知道,C++提供了一个非常强大的操作符重载机制,利用操作符重载,我们可以为我们自定义的类增加更多非常有用的功能。不过,C++也有限制,就是当我们为自定义的类重载操作符时,重载操作符的含义应该跟内置类型一样,比如,你不能通过重载+号操作符来实现两个数相乘的运算,实现需要是两个数相加的运算。本篇,我重点介绍下重载前置++和后置++的区别(前置--跟后置--类似)。

  我们知道,写for循环年的时候,可以用下面这两种方式:  


for(int i=0; i<10; i++) {
     //do something   
}

for(int j=0; j<10; ++j) {
  //do something   
}

  如上两种方式,i++跟++j到底有什么区别呢?

  首先,这两种方式都会使得i跟j自增1, 不同的地方在于其内部实现; ++j的实现原理是现将i自增1,然后返回i的引用(我们知道重载操作符也是可以有返回值的);而i++的实现原理是:先定义一个j的副本,然后在将j自增1,最后返回之前定义个那个副本的值。

       所以,前置++效率更高,后置++要拷贝一个临时对象。

  通常,c++的内置类型都要求前缀式操作符返回被增量或被减量对象的引用;而要求后缀式操作符返回被增量活被减量对象做增或减操作之前的副本(这里边就存在内存拷贝)。

  实际的调用过程看起来应该是这样:


for( int i=0; i<10; i.operator++(0) ) {   //调用后置++
     //do something   
}

for( int i=0; i<10; i.operator++() ) {    //调用前置++
     //do something   
}

  看到这里,你可能 有个疑问,为什么调用后置++的之后,参数列表要传一个0而前置++却没有传呢?

  这里就牵扯出前置++跟后置++的另一个差别。

  前置++和后置++在定义的都是一样,看起来应该是下边这样:


class A {
private:
     int a;
public:
    
     A& operator++() {
           //...
     }   
     
     A  operator++() {
          //...
     }

}

  这样,我们就无法区分到底哪个是哪个了,也许你会说它们的返回值不是不一样吗? 我们老早就知道,无法通过不同的返回值来重载不同的函数版本。

  这种情况下,为了做区分也是为了解决这一问题,一般要求后缀式操作符接受一个额外的int型形参(不会使用它,仅做区分用),来区别两者的不同。

      


class A {
private:
     int a;
public:
    
     A& operator++() {     //前置++
           //...
     }   
     
     A  operator++(int) {   //后置++
          //...
     }

}

  这样,编译器将为我们提供0作为这个后缀式版本的形参。(也可以调用这个有参数的版本做前缀式操作,不过一般不应该这么做),下边是完整定义:


class A {
private:
     int a;
public:
    
     A& operator++() {     //前置++
          ++a;
          return *this;
     }   
     
     A  operator++(int) {   //后置++
         A a = *this;
         ++*this;
         return a;
     }

}

  如上,操作符的后缀式比前缀式复杂一些,在实现后缀式版本时,一般先保存对象做自增/减之前的副本,然后调用自己的前缀版本来实现自增操作,最后将先前年保留的副本

返回。这里需要注意的是,后缀式版本中,返回值是尚未自增的原值,但对象本身已经做了自增操作了。

  ( ps : --操作符的前缀式和后缀式类型)


转自:

http://www.cnblogs.com/yuxingfirst/p/3258712.html

C++ 递增运算符:前置++和后置++的区别 首先说下结论:迭代器和其他模板对象应该使用前缀形式 (++i) 的自增,,自减运算符,因为前置自增 (++i) 通常要比后置自增 (i++) 效率更高 前置++和后置++,有4点不同:返回类型不同、形参不同、代码不同、效率不同 int main() { Age a; (a++)++; //编译错误 ++(a 阅读详情

相关推荐

(001) i++ 与 ++i & 左值与右值的本质区别

i++与++i的区别,返回值、重载类型、成为左值

曾几何时的博客 1714

C++中重载运算符—前缀和后缀的区别

运算符的前缀和后缀前缀++和后缀++的区别在运算符重载中前缀++和后缀++的使用 前缀++和后缀++的区别 i++: 先访问i再进行++操作 ++i:先进行++操作再访问i 在运算符重载中前缀++和后缀++的使用 案例背景:有一个Point类,有成员变量x和y,现需要对Point类重载“++” 前缀++:++i最后返回的是被++对象的引用,因此“++i”可以作为左值(例如进行赋值操作:++i=5...

qq_39515533的博客 2110

window部署open claw(使用wsl-Ubuntu-docker部署)

本文详细介绍了在Windows 11系统下通过WSL2+Docker部署OpenClaw的完整流程。首先需要满足硬件配置要求并开启虚拟化功能,然后依次完成WSL2安装配置、Docker Desktop安装、OpenClaw镜像拉取等步骤。重点说明了端口映射、socat转发配置及openclaw.json文件修改方法。最后通过验证WSL2内网IP和端口访问服务。该方案具有最佳兼容性,能有效避免Windows环境下的依赖冲突问题。

Kmoyic的博客 2763

【C++】前缀++和后缀++的区别

因为现在在看典型运算符的重载,其中有对前缀++和后缀++的重载,又忘记了它们之间的区别,去论坛看了下得到了很好的理解, 区别: 引用论坛中博友的话: 前缀就是自己本身+1 后缀就是给一个没+1的副本使用 对于这句话我大概理解到了,不过这针对的应该是返回值来说的。 ++i和i++连起来应该看是一个函数的缩写。可以对照运算符重载中对增量运算符的重载。 然后又通过下面博友...

lanlanla的成长历程 1万+

单目标跟踪算法及其复现过程---SiamFC(一)

在test.py文件中,就是利用训练出来的模型进行测试,需要更改预训练模型的路径,测试集的路径,以OTB100为例,最后输出的是对每一帧目标位置的坐标点。代码如下:首先需要下载got10k官方库,只需要在终端输入(注意:在终端安装各种库的时候不能使用网络代理),在环境已经配置到的情况下,只需要该其中的路径和就可以运行。这个系列博客仅为了记录各目标跟踪算法的复现(大多为跑通大佬们实现的代码),包括其中出现的很多问题和错误,学到的新知识等等。解决,而且只使用在线的方法,限制了他们可以学习的模型的丰富性。

weixin_58244117的博客 4759

新手避坑指南:用镭神C32和KVH 1750 IMU做标定,为什么直接上lidar_align会失败?

本文详细解析了使用镭神C32激光雷达和KVH 1750 IMU进行标定时常见的失败原因及解决方案。从IMU的微分传感器特性到Lidar-IMU标定的数学本质,再到可行的标定方案和实操注意事项,帮助新手避开认知陷阱,掌握正确的标定方法。

weixin_30162121的博客 327

【C++基础入门】35.C++中的前置操作符和后置操作符

文章目录 一、值得思考的问题 二、意想不到的事实 三、++ 操作符重载 四、真正的区别 五、小结 一、值得思考的问题 下面的代码有没有区别?为什么? 二、意想不到的事实 现代编译器产品会对代码进行优化 优化使得最终的二进制程序更加高效 优化后的二进制程序丢失了 C/C++ 的原生语义 不可能从编译后的二进制程序还原 C/C++ 程序 三、++ 操作符重载 ++ 操作符可以重载吗?如何区分前置++ 和后置++? ++ 操作符可以被重载 全局函数和成员函数均...

老胡的博客 2282

深度学习|卷积神经网络

介绍卷积神经网络基本理论,包括卷积层、池化层和全连接层,并阐述LeNet卷积神经网络的构建过程。

weixin_58243219的博客 5719

c++运算符前置++与后置++的重载的区别 学习笔记

重载

记录学习过程 2662

07. 基础实战篇 - STP的基本配置

STP(生成数协议)是一个用于在局域网中消除环路的协议,他的标准是IEEE802.1d。STP通过强制使部分冗余链路处于阻塞状态,其它链路处于转发状态,将环形网络结构修剪成无环路的树形网络结构。可实现消除环路,当处于转发状态的链路不可用时,STP重新配置网络,并激活合适的备用链路状态,恢复网络连通性。

weixin_39868387的博客 7224

CListCtrl控件的自绘操作

1、CListCtrl控件 :OwnerDraw Fixed = True,创建一个CListCtrl类的派生类CMyListCtrl,同时创建一个CMyListCtrl控件类型变量:CMyListCtrl m_cList;。 CListCtrl控件的自绘主要是CMyListCtrl类中重写DrawItem虚函数。 流程: 1.主对话框中CListCtrl的一些初始化操作: BOOL

小米的修行之路 3559

C++前置++与后置++的区别与重载

++属于单目运算符,前置与后置的实现代码不一样,下面以整数自增为例: // 前置++,返回自增后的值,且返回的是一个左值 int& operator++(){ *this += 1; return *this; } // 后置++,返回自增前的值,且返回的是一个右值 const int operator++(int){ int temp(*this);...

dongbang20140616的博客 476

RTCA DO-160G标准详解:航空电子设备的全面环境适应性测试指南

第二章的主要目的是提供标准中使用的术语和定义。了解这些术语对于准确理解标准的要求至关重要,特别是在技术实施过程中。RTCA DO-160G 涉及多个学科的知识,包括航空、电子、电磁学和机械工程,因此需要确保使用的术语在所有学科中具有一致的定义。为了确保测试人员和工程师在执行测试时对所有条件和要求的理解一致,RTCA DO-160G 标准中定义了大量术语。环境应力:指的是设备在操作过程中可能遇到的外部物理或化学条件,包括温度、湿度、振动等。电磁干扰(EMI)

qq_41854911的博客 5275

关于C/C++前置++与后置++的区别与习题

本题相信大多数人都是对D选项有疑惑: D选项,函数的参数是从右向左压栈的,输出时从栈顶开始,相当于: int i = 3; ++i; ++i; printf("%d,%d",i,i);所以是 5,5; 再举一个例子,int i = 1; printf("%d,%d", i += 2, i *= 3); 在输出i之前先进行了i *= 3和 i += 2;最终i = 5;所以结果是5,5; 下面是...

AngelDg的博客 1160

【AI理论学习】手把手推导扩散模型:Diffusion Models(DDPM)

生成扩散模型DDPM如下图所示分为前向、逆向两个过程,它首先通过不断往原始清晰数据中添加噪声使其变成标准高斯噪声(前向过程),而后期望从标准高斯噪声中还原原始数据(逆向过程)。若能实现,那便可从已知的标准高斯分布中采样一个噪声数据,而后利用DDPM模型生成符合原始数据分布的新数据。 Diffusion模型包含两个过程:数学符号:y∝xy\propto xy∝x:y正比于x,即y随着x增大而线性增大。 条件概率:贝叶斯公式:p(A∣B)=p(B∣A)×p(A)p(B)p(A|B)=\frac{p(B|A)\

小哲的博客 1507

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C++迭代器后置++与前置++有什么区别

引言 在看到代码后感觉确实以前只是知道为什么 有点人云亦云的感觉 而没有眼见为实过 遂记录这篇博客 解决有同等需求的朋友 Talk is cheap, show your std code. __normal_iterator&//前置 operator++() _GLIBCXX_NOEXCEPT //noexcept { ++_M_current;/...

李兆龙的博客 1657

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【C++深度解析】28、重载前置++与后置++

需要栈空间存储临时变量,同时需要调用构造函数创建对象,调用析构函数销毁对象。

桑凯旋的博客 1564

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

前置++与后置++区别

对于前置++与后置++以前只知道它们的两点区别: 1. 前置++:先加再用;后置++:先用后加。 2. ++i效率比i++效率高; 今日又添加一项: 4. 前置++可操作,后置++不可操作 只知其果,不明其因非学者姿态。 下面是前置++与后置++实现的demo: #include <iostream> using namespace std; class Clock { int hour, min, second; public: Clock(int newhour, int newmin

森四杨的博客 3310

前置++与后置++区别 以及效率

前置与后置++ 的区别 前置++和后置++的区别 《C专家编程》中有如下描述(P276,人民邮电出版社): ++a表示取a的地址,增加它的内容,然后把值放在寄存器中; a++表示取a的地址,把它的值装入寄存器,然后增加内存中的a的值;(也就是说操作的时候用到的都是寄存器里面的值,

微小的鱼的博客 6814

前置++和后置++之间的区别以及分别使用的场景

前置++是通过对自身进行操作,并不需要申请临时变量等,所以效率会更高一点,而后置++需要申请临时变量,所以一般情况下会推荐使用前置++。在这里就是函数里返回了一个临时变量,但是函数外面进行了调用,这是不行的。正常的就是把这个临时变量的值赋值给别人。新建一个包含int类型的属性a和属性b,实现前置++和后置++的功能,都是对属性a和b进行加1。报错的意思是对一个临时变量作用外求地址,这在c++里面是不允许的,因为对。示例二、对后置++输出地址。

weixin_42295969的博客 1529

前++与后++的区别?反汇编底层刨析

单独++不和其他运算符结合时,前置和后置一样当和其他运算符结合时前置++是先++后赋值,a=1;i=++a;//a=2,i=2;后置++是先赋值再++ ,a=1;i=a++;//a=2,i=1;前置++可以做左值,后置不可以前置可以取地址&,后置不可以。

qq_53830608的博客 4176

【C++基础】Day 6:前置++ VS 后置++(语法底层 + STL规范 + 面试高频)

C++运算符重载:前置++与后置++的深度解析 本文详细解析了C++中前置++(++i)和后置++(i++)的区别与实现要点。前置++通过operator++()实现,无参数且返回引用,效率高;后置++通过operator++(int)实现,需创建临时对象保存旧值并返回对象副本。文章从语法定义、底层原理、性能对比等方面进行了深入剖析,特别强调了后置++应返回const对象以避免(i++)++这类无意义操作。最后提供了完整的代码示例和常见面试问题解答,建议在自定义类型中优先使用前置++以获得更好性能。

冰冻三尺非一日之寒 1114

重载 前置++与后置++

重载 前置++与后置++ 不同于普通的双目运算符“+/-”,自增自减运算符“++/–”在重载的时候需要额外留意区分是前置式还是后置式。现行的处理方法是,(作为成员函数的)前置“++”不接受任何参数,而后置“++”接受一个int类型的参数,尽管没什么实际用途,但是却为编译器确定重载对象提供了帮助。 除了区分的时候需要注意,他们的行为也是有所区别的。援引More Effective C++中的话,前...

Conquer_ALL的博客 1464

i++,++i,i+=1,i = i+1在C++中的区别

其实这个问题可以从三个角度去分析:语言规范,编译器实现,CPU支持。首先从语言规范上来讲;前置++和后置++是不等价的,前置++在规范中明确指出 和+=组合操作符是等价的,但和E = E+1;这样的赋值操作不等价,因为后者对操作数E需要进行两次求值,而+=组合操作符只进行一次求值。后置++表示操作数作为结果值被获取之后操作数的 原值再进行更新。 聪明的编译器可以根据应用场景进行优化(标准不规定相关...

weixin_30527551的博客 709

前置++和后置++的区别

但是呢,作为表达式,i++的值是自增之前的值,++i的值是自增之后的值。   本文在此基础上,进行一些稍微深入的讨论。   从操作符重载的角度,看i++和++i的区别,是一个比较好的切入点。   操作符重载 假设有一个类Age,描述年龄。该类重载了前置++和后置++两个操作符,以实现对年龄的自增。 class Age { public: Age&amp; operator++() //前置++ { ++i; return *this; } co

德平的专栏 263

C++--前置操作符与后置操作符

一.前置操作符与后置操作符 Q:下面的代码有没有区别?为什么?代码的实现 #include <iostream> #include <string> using namespace std; int main() { int i = 0; i++; ++i; return 0; } 意想不到的事实1.现代编译器都会对代码进行优化2...

cangnuan2978的博客 366
上一篇: Windows上通过程序写入回车字符
下一篇: Binder通信
nodeathphoenix
博客等级 码龄16年 97粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值