C++学习笔记--前置、后置操作符
来源:互联网 发布:广州数控车床编程入门 编辑:程序博客网 时间:2024/06/06 00:41
在C语言中我们学习了前置操作符和后置操作符,比如++i,--i,i++,i--,由于++和--属于同类型操作符,此处讲解均以++作为模型。
首先问一个问题,i++和++i有何区别?
i++就是先返回i的值然后再加1;++i则是先对i加1再返回i的值。这是一般的解释。
工程中,在C/C++中单独的两条语句在编译器编译后并没有任何区别,实现的汇编代码是一样的。
通过观察汇编代码发现确实没有什么区别,只有寄存器使用的不一样。
所以说,现代编译器会对代码进行优化使得最终的二进制程序更加高效,但是被优化后的代码失去了操作符原有的语义,不再可能从编译后的二进制程序还原成原先的C/C++代码,也就是说通过C/C++开发的软件无法完全反编译。
解释了普通类型的前置、后置操作符后我们想想能不能对他们也进行不改变语义的重载呢?要是可以的话又该如何进行区分?
同样的,++操作符也属于内置操作符,所以可以进行重载,并且全局函数和成员函数均可以进行重载,那么如何区分呢?重载前置++时不需要任何额外的参数;重载后置++操作符需要一个int类型的占位参数。重载过程如下:
Test& operator ++ () { ++mValue; return *this; } Test operator ++ (int) { Test ret(mValue); mValue++; return ret; }第一个是前置++重载,它的实现就是将类成员变量进行一个前置++操作,然后返回当前对象。后置++区别就大了一些,首先是声明形式上,它的返回类型是一个类对象,并且参数列表多了个int类型的占位参数,实现过程中使用了个临时对象,用类成员变量初始化,然后对类成员变量进行后置++操作,函数返回的是临时对象。所以,前置++操作符重载时效率更高,因为它不需要创建对象,不需要调用构造函数和析构函数,不需要占用空间。现在使用试试:
Test t(0); Test t1 = t++; cout << t1.value() << endl; Test t2 = ++t1; cout << t2.value() << endl;
看看输出会是什么?
0
1
答案正是我们想要的,说明我们的重载是成功的。
所以我们可以真正回答文章开始的提问了,i++和++I有何区别?
对于基础类型的变量来说,前置++与后置++的效率基本相同,因为可能会经过编译器的优化。
对于类类型的变量来说,前置++的效率高于后置++的效率,所以我们应该尽可能使用前置++来提高程序运行效率。
阅读全文
0 0
- C++学习笔记--前置、后置操作符
- 重载操作符++,区别前置和后置
- 前置操作与后置操作
- [C++] C++的运算符重载(+、-、前置--、后置--,前置++,后置++、==)
- [C++] C++的运算符重载(+、-、前置--、后置--,前置++,后置++、==)
- Spring学习笔记之前置通知&后置通知
- Spring学习笔记之前置通知、后置通知
- 关于前置操作符和后置操作符的区别
- C++ 前置操作符与后置操作符
- 40-前置操作符++i和后置操作符i++
- C 语言前置++ 与后置++
- 关于++操作符的前置和后置的区别
- 操作符重载前置和后置的区别与实现
- 操作符重载的两种用法(前置后置++)
- 前置++后置++等操作符的源码剖析
- c加加+-*/前置++后置++运算符重载
- Thinkphp 控制器->前置操作和后置操作
- C++运算符前置后置
- WIFI技术-Radio Resource Management
- 语音识别哪家强 讯飞 搜狗 百度 阿里还是腾讯
- 剑指offer——用两个栈实现队列(Java)
- 011 数学期望、方差及方差性质
- net.sf.json.JSONException: Error while setting property=createDate type class java.lang.String
- C++学习笔记--前置、后置操作符
- 欢迎使用CSDN-markdown编辑器
- phpstorm误删除的文件或文档找回方式
- Python函数中输入任意数量参数
- python flask中config配置管理问题
- 写冒泡排序可以排序多个字符串。
- 触发器
- 理解RxJava(一)基本流程源码分析
- LintCode之28 搜索二维矩阵