今天来学习C++中的前置操作符(++i)与后置操作符(i++)。

一回顾

以前在C语言的理论课程中,我们就学过,前置和后置操作符,有一定的区别:

但是我们可以看到下图,发现前置和后置++的操作符所对应的汇编语言(14行和16行所对应的的汇编完全一样),是完全一样的(在linux下的eclipse软件中进行Debug调试):

这是为什么呢?难道之前学的C语言的理论是错的么?并不是的,这里面,首先这两个i经过前后置++后,并没有被用起来,结果是什么也并不重要,所以现代的编译器软件就对程序进行优化,将这两行语句优化成一样的:

但是这也产生了一些意想不到的事:

  1. 优化使得最终的二进制程序更加高效
  2. 优化后的二进制程序丢失了C/C++原有的语义
  3. 不可能从编译后的二进制程序,还原C/C++程序。

二拓展

问题:
那么,++操作符可以被重载么,能够重载的话,又是如何区分前置++与后置++的?

回答:
++操作符可以被重载

  1. 全局函数和成员函数都可以被重载
  2. 重载前置++操作符不需要额外的参数
  3. 重载后置++操作符需要一个int类型的占位参数

下面我们还是来直接写一个代码,来分析,会更加清晰:

#include <iostream>
#include <string>using namespace std;class Test
{int mValue;
public:Test(int i){mValue = i;}int value(){return mValue;}Test& operator ++ () //这里返回的是对象的引用,可以对比下面后置++的返回值{++mValue;        //前置++操作符效率高一些,因为没有生成额外的对象,就不需要在栈空间//占用额外的空间,节省了内存,并且不需要调用构造函数以及析构函数return *this;    //返回当前对象的指针}Test operator ++ (int)  //这里为什么返回的不是引用呢?因为后置++是先需要把值保存起来然后再自加一,所以这里需要一个局部对象,把                             {                       //值保存在这个Test ret(mValue);   //先保存值mValue++;           //临时局部的对象中,所以返回值就是类对象的值。再++return ret;           }
};int main()
{Test t(0);Test tt = t++;cout << tt.value() << endl;cout << t.value() << endl;cout << endl;Test tt2 = ++t;cout << tt2.value() << endl;cout << t.value() << endl;return 0;
}

运行结果为:
0
1

2
2

分析:

程序注释中,对于操作符的重载已经讲解的很清楚。

由打印结果知,前两个值为0,1,后置操作符先把值给tt,再自己++,这保持了后置操作符的原生语义。同理,由后两个打印语句,得知前置操作符的原生语义,也被保持了。

那么,这两个重载的操作符,真正的区别,在哪里呢?

-对于基础类型的变量

  • 前置++与后置++的操作符的效率基本相同
  • 根据项目组编码规范进行选择

    -对于类类型的对象

  • 前置++的效率高于后置++的效率(具体原因看程序注释)

  • 尽量使用前置++的操作符提高程序的效率

3延伸

那么我们现在就可以来再次完善我们之前实现的复数类了,具体代码整个代码过长,我就放到码云平台,大家可以自行下载。
点击下载:点击下载复数类源码

4总结

  1. 编译优化使得最终的可执行程序更加高效
  2. 前置操作符++与后置操作符++都可以被重载
  3. ++操作符的重载必须符合其原生语义
  4. 对于基础类型,前置和后置++操作符效率几乎一样
  5. 对于类类型,前置++的效率高于后置++的效率

想一起探讨以及获得各种学习资源加我(有我博客中写的代码的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题。

【C++深度剖析教程19】前置操作符与后置操作符相关推荐

  1. C++中前置操作符和后置操作符的重载

    文章目录 1 C++中前置操作符和后置操作符的重载 1.1 前置操作符和后置操作符的原生语义 1.2 ++操作符的重载 1.3 前置++和后置++的真正区别 1 C++中前置操作符和后置操作符的重载 ...

  2. 40 - 前置操作符和后置操作符

    ---- 整理自狄泰软件唐佐林老师课程 1. 问题 下面代码的区别?why? 1.1 编程实验 汇编中的处理是一样的,所以不可能从编译后的二进制程序还原 ++i 还是 i++ 1.2 事实 现代编译器 ...

  3. 公司注册涉及前置审批和后置审批的经营范围有哪些(2019年上海最新版)

    客户注册公司的时候,有时会有这样的疑惑,为什么我想经营这个,却被告之这个经营范围涉及到许可证的办理,是需要进行前置审批(或者后置审批),办理专项许可证的.那么,到底什么是前置审批和后置审批呢?具体哪些 ...

  4. HTML5调用手机前置摄像头或后置摄像头拍照,canvas显示,经过Android测试

    为什么80%的码农都做不了架构师?>>>    但是navigator.getUserMediau已经从 Web 标准中删除,虽然部分浏览器可以使用,生产环境中还是要做好兼容.新的A ...

  5. thinkPHP 空模块和空操作、前置操作和后置操作 具体介绍(十四)

    本章节:介绍 TP 空模块和空操作.前置操作和后置操作 具体介绍 一.空模块和空操作 1.空操作 function _empty($name){ $this->show("$name ...

  6. Python Pytest前置setup和后置teardown详解

    pytest用例运行级别: ●模块级(setup_module/teardown_module)开始于模块始末,全局的 ●函数级(setup_function/teardown_function)只对 ...

  7. html5 android6.0摄像头,HTML5调用手机前置摄像头或后置摄像头拍照,canvas显示,经过Android测试...

    但是navigator.getUserMediau已经从 Web 标准中删除,虽然部分浏览器可以使用,生产环境中还是要做好兼容.新的API更替为MediaDevices.getUserMedia.Me ...

  8. 三星Galaxy Note 10渲染图曝光:前置打孔双摄+后置横排四摄

    [TechWeb]三星刚刚在美国发布了全新的期间机型Galaxy S10系列,近日也正式开启了首销.从首销的销量来看,相较于前两代S系列机型来说,S10还是取得了不错的成绩,有了一定量的提升. 然而, ...

  9. Spring AOP中的前置通知和后置通知详解

    不同版本的spring对AOP的支持有所不同,spring2.0之前,它主要针对不同类型的拦截器使用XML配置文件通过代理来实现.而spring2.0之后,它可以使用JDK5的注解来完成AOP的实现, ...

最新文章

  1. 半个月两次投资,百度健康再扩服务版图
  2. 【白话机器学习】算法理论+实战之PageRank算法
  3. Node — 第六天(前后端分离)及(身份验证)
  4. 产线数字化软件源码_品质笔记⑥丨卢宇聪:把握数字化趋势,坚定创新发展道路...
  5. 任务调度开源框架Quartz动态添加、修改和删除定时任务
  6. MySQL 之 performance_schema
  7. Java:键盘输入一个小数,输出其整数部分
  8. 集训队论文之经典数学题【收藏】
  9. vue中index.html文件为什么可以使用模板语法
  10. 手机文档转html,手机金山文档怎么转换成Word文档电脑手机?
  11. 【入坑树莓派】烧录系统都烧录了三次(树莓派默认账户密码错误/已删除)
  12. 利用python进行识别相似图片
  13. 将图片背景设置为透明的方法介绍
  14. 数据库原理 | 第1章 概述
  15. 微信公众号 java 教程视频下载_微信公众号开发视频教程java
  16. Canvas笔画向量交互动画效果,随着鼠标描绘轨迹
  17. nlp gpt论文_gpt 3变形金刚和nlp的狂野世界
  18. iOS开发实用技术之音频播放(QQ音乐)
  19. word文档怎么删除多余的空白页?
  20. 工业相机与普通相机的区别

热门文章

  1. html:(29):伪选择符和分组选择符
  2. html:(23):css代码语法和css注释语法
  3. java学习(137):java异常初识
  4. OpenCV:SURF算法浅析
  5. ajax是操作系统吗,ajax 跟post 可以设置它是否同步执行
  6. 优地机器人厂家_2019中国人工智能机器人企业TOP30榜单发布 优地科技跻身前十...
  7. python中urframe函数的用法_python类中的内置函数
  8. Python自制微信机器人:群发消息、自动接收好友
  9. Django-视图层
  10. Python的特殊成员