【C++深度剖析教程19】前置操作符与后置操作符
今天来学习C++中的前置操作符(++i)与后置操作符(i++)。
一回顾
以前在C语言的理论课程中,我们就学过,前置和后置操作符,有一定的区别:
但是我们可以看到下图,发现前置和后置++的操作符所对应的汇编语言(14行和16行所对应的的汇编完全一样),是完全一样的(在linux下的eclipse软件中进行Debug调试):
这是为什么呢?难道之前学的C语言的理论是错的么?并不是的,这里面,首先这两个i经过前后置++后,并没有被用起来,结果是什么也并不重要,所以现代的编译器软件就对程序进行优化,将这两行语句优化成一样的:
但是这也产生了一些意想不到的事:
- 优化使得最终的二进制程序更加高效
- 优化后的二进制程序丢失了C/C++原有的语义
- 不可能从编译后的二进制程序,还原C/C++程序。
二拓展
问题:
那么,++操作符可以被重载么,能够重载的话,又是如何区分前置++与后置++的?
回答:
++操作符可以被重载
- 全局函数和成员函数都可以被重载
- 重载前置++操作符不需要额外的参数
- 重载后置++操作符需要一个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总结
- 编译优化使得最终的可执行程序更加高效
- 前置操作符++与后置操作符++都可以被重载
- ++操作符的重载必须符合其原生语义
- 对于基础类型,前置和后置++操作符效率几乎一样
- 对于类类型,前置++的效率高于后置++的效率
想一起探讨以及获得各种学习资源加我(有我博客中写的代码的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题。
【C++深度剖析教程19】前置操作符与后置操作符相关推荐
- C++中前置操作符和后置操作符的重载
文章目录 1 C++中前置操作符和后置操作符的重载 1.1 前置操作符和后置操作符的原生语义 1.2 ++操作符的重载 1.3 前置++和后置++的真正区别 1 C++中前置操作符和后置操作符的重载 ...
- 40 - 前置操作符和后置操作符
---- 整理自狄泰软件唐佐林老师课程 1. 问题 下面代码的区别?why? 1.1 编程实验 汇编中的处理是一样的,所以不可能从编译后的二进制程序还原 ++i 还是 i++ 1.2 事实 现代编译器 ...
- 公司注册涉及前置审批和后置审批的经营范围有哪些(2019年上海最新版)
客户注册公司的时候,有时会有这样的疑惑,为什么我想经营这个,却被告之这个经营范围涉及到许可证的办理,是需要进行前置审批(或者后置审批),办理专项许可证的.那么,到底什么是前置审批和后置审批呢?具体哪些 ...
- HTML5调用手机前置摄像头或后置摄像头拍照,canvas显示,经过Android测试
为什么80%的码农都做不了架构师?>>> 但是navigator.getUserMediau已经从 Web 标准中删除,虽然部分浏览器可以使用,生产环境中还是要做好兼容.新的A ...
- thinkPHP 空模块和空操作、前置操作和后置操作 具体介绍(十四)
本章节:介绍 TP 空模块和空操作.前置操作和后置操作 具体介绍 一.空模块和空操作 1.空操作 function _empty($name){ $this->show("$name ...
- Python Pytest前置setup和后置teardown详解
pytest用例运行级别: ●模块级(setup_module/teardown_module)开始于模块始末,全局的 ●函数级(setup_function/teardown_function)只对 ...
- html5 android6.0摄像头,HTML5调用手机前置摄像头或后置摄像头拍照,canvas显示,经过Android测试...
但是navigator.getUserMediau已经从 Web 标准中删除,虽然部分浏览器可以使用,生产环境中还是要做好兼容.新的API更替为MediaDevices.getUserMedia.Me ...
- 三星Galaxy Note 10渲染图曝光:前置打孔双摄+后置横排四摄
[TechWeb]三星刚刚在美国发布了全新的期间机型Galaxy S10系列,近日也正式开启了首销.从首销的销量来看,相较于前两代S系列机型来说,S10还是取得了不错的成绩,有了一定量的提升. 然而, ...
- Spring AOP中的前置通知和后置通知详解
不同版本的spring对AOP的支持有所不同,spring2.0之前,它主要针对不同类型的拦截器使用XML配置文件通过代理来实现.而spring2.0之后,它可以使用JDK5的注解来完成AOP的实现, ...
最新文章
- 半个月两次投资,百度健康再扩服务版图
- 【白话机器学习】算法理论+实战之PageRank算法
- Node — 第六天(前后端分离)及(身份验证)
- 产线数字化软件源码_品质笔记⑥丨卢宇聪:把握数字化趋势,坚定创新发展道路...
- 任务调度开源框架Quartz动态添加、修改和删除定时任务
- MySQL 之 performance_schema
- Java:键盘输入一个小数,输出其整数部分
- 集训队论文之经典数学题【收藏】
- vue中index.html文件为什么可以使用模板语法
- 手机文档转html,手机金山文档怎么转换成Word文档电脑手机?
- 【入坑树莓派】烧录系统都烧录了三次(树莓派默认账户密码错误/已删除)
- 利用python进行识别相似图片
- 将图片背景设置为透明的方法介绍
- 数据库原理 | 第1章 概述
- 微信公众号 java 教程视频下载_微信公众号开发视频教程java
- Canvas笔画向量交互动画效果,随着鼠标描绘轨迹
- nlp gpt论文_gpt 3变形金刚和nlp的狂野世界
- iOS开发实用技术之音频播放(QQ音乐)
- word文档怎么删除多余的空白页?
- 工业相机与普通相机的区别
热门文章
- html:(29):伪选择符和分组选择符
- html:(23):css代码语法和css注释语法
- java学习(137):java异常初识
- OpenCV:SURF算法浅析
- ajax是操作系统吗,ajax 跟post 可以设置它是否同步执行
- 优地机器人厂家_2019中国人工智能机器人企业TOP30榜单发布 优地科技跻身前十...
- python中urframe函数的用法_python类中的内置函数
- Python自制微信机器人:群发消息、自动接收好友
- Django-视图层
- Python的特殊成员