24、不一样的C++系列--i++和++i
来源:互联网 发布:vivian maier 知乎 编辑:程序博客网 时间:2024/06/06 05:52
前置操作符和后置操作符
首先呢,我们来思考一个问题:
//下面的代码有没有区别?为什么? i++; // i的值作为返回值,i 自增 1 ++i; // i自增 1, 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; } //重载后置 ++操作符,需要一个int类型的参数 Test operator ++ (int) { Test ret(mValue); mValue++; return ret; }};int main(){ Test t(0); //这里通过重载操作符,直接可以实现类类型的自加 t++; ++t; return 0;}
看完代码,其实也可以再次回答刚开始的问题了:
- 区别:
- 对于基础类型的变量
- 前置 ++ 的效率与后置 ++ 的效率基本相同
- 根据项目组编码规范进行选择
- 对于类类型的对象
- 后置 ++的重载函数中需要 新创建一个临时对象,随即又要销毁
- 前置 ++的重载函数中不需要创建对象
- 所以 前置 ++ 的效率高于后置 ++
- 尽量使用前置 ++ 操作符提高程序效率
- 对于基础类型的变量
注意
看完 ++ 操作符的重载以后,其实也可以推出 - - 操作符和 ++ 操作符的重载规则是一样的,所有适用于 ++ 操作符的规则和特性也同样适用于 - - 操作符。
小结
- 编译优化使得最终的可执行程序更加高效
- 前置 ++ 操作符和后置 ++ 操作符都可以被重载
- ++ 操作符的重载必须符合其原生语义
- 对于基础类型,前置 ++ 与后置 ++ 的效率几乎相同
- 对于类类型,前置 ++ 的效率高于后置 ++
- ++ 操作符的重载规则和特性同样也适用于 - - 操作符
阅读全文
0 0
- 24、不一样的C++系列--i++和++i
- [C++]关于i++和++i的学习
- [C++]关于i++和++i的学习
- [C++]关于i++和++i的学习
- [C++]关于i++和++i的学习
- 【c++】i++和++i的区别
- 【c语言】i++和++i的区别
- ++i和i++的区别(C++)
- ++i,i++,--i和i--的区分
- C++:探讨i++和++i
- C关于i++和++i
- C语言++i和i++
- c语言i++和++i和左值的问题
- C语言优先级和(i++)+(i++)与(++i)+(++i)
- C/C++程序设计中i++和++i的区别
- 【考研】C语言i++和++i的区别
- C语言中的 i++ 和 ++i 的区别
- C语言笔记——(i++)和(++i)的区别
- jQuery系列之添加元素或文本+jQ操作(六)
- Advanced Troubleshooting of CSS Heartbeat Failures
- 获取SqlProfiler中的存储过程
- Maven 修改默认jdk版本
- VS2010使用c++、gSOAP创建WebService 图文教程
- 24、不一样的C++系列--i++和++i
- 深入理解 Thread.Sleep 函数
- 搭建邮件服务器之SMTP发送服务器(五)
- Vs2008调试慢的问题
- FFMPEG学习【libavformat】:核心函数
- 【LeetCode】132.Palindrome Partitioning II
- C++标准库笔记:13.12.4 以非格式化函数完成自定义IO操作符
- VC++ 创建和调用WebService 图文教程 相关资料等
- 创建索引