C++ 递增运算符:前置++和后置++的区别
来源:互联网 发布:女性生殖健康 知乎 编辑:程序博客网 时间:2024/04/30 11:51
首先说下结论:迭代器和其他模板对象应该使用前缀形式 (++i) 的自增,,自减运算符,因为前置自增 (++i) 通常要比后置自增 (i++) 效率更高
前置++和后置++,有4点不同:返回类型不同、形参不同、代码不同、效率不同
int main() { Age a; (a++)++; //编译错误 ++(a++); //编译错误 a++ = 1; //编译错误 (++a)++; //OK ++(++a); //OK ++a = 1; //OK }
返回类型不同
前置++的返回类型是左值引用,后置++的返回类型const右值。而左值和右值,决定了前置++和后置++的用法。
++a的返回类型为什么是引用呢?
这样做的原因应该就是:与内置类型的行为保持一致。前置++返回的总是被自增的对象本身。因此,++(++a)的效果就是a被自增两次。
形参的区别
前置++没有形参,而后置++有一个int形参,但是该形参也没有被用到。很奇怪,难道有什么特殊的用意?
其实也没有特殊的用意,只是为了绕过语法的限制。
前置++与后置++的操作符重载函数,函数原型必须不同。否则就违反了“重载函数必须拥有不同的函数原型”的语法规定。
虽然前置++与后置++的返回类型不同,但是返回类型不属于函数原型。为了绕过语法限制,只好给后置++增加了一个int形参。
原因就是这么简单,真的没其他特殊用意。其实,给前置++增加形参也可以;增加一个double形参而不是int形参,也可以。只是,当时就这么决定了。
代码实现的区别
前置++的实现比较简单,自增之后,将*this返回即可。需要注意的是,一定要返回*this。
后置++的实现稍微麻烦一些。因为要返回自增之前的对象,所以先将对象拷贝一份,再进行自增,最后返回那个拷贝。
效率的区别
如果不需要返回自增之前的值,那么前置++和后置++的计算效果都一样。但是,我们仍然应该优先使用前置++,尤其是对于用户自定义类型的自增操作。
前置++的效率更高,理由是:后置++会生成临时对象。
C++Primer中(P132)有这样简介的描述:
前置版本将对象本身作为左值返回,后置版本则将原始对象的副本作为右值返回,两种运算符必须作用于左值运算对象。后置版本需要拷贝副本,所以会影响程序的性能
- C++ 递增运算符:前置++和后置++的区别
- C++中前置递增运算符和后置递增运算符的区别
- 前置递增和后置递增的区别
- 前置运算符和后置运算符的区别
- C++前置式递增和后置式递增的区别
- 前置与后置运算符的区别
- [C++] 前置++和后置++的区别
- 运算符前置++和后置++的重载
- 前置和后置++运算符的重载
- 前置递增和后置递增
- 前置和后置运算符
- 前置运算符与后置运算符的区别
- 前置++和后置++的区别
- ++前置和后置的区别
- 前置++和后置++的区别
- 前置++和后置++的区别
- 前置++和后置++的区别
- [C++] C++的运算符重载(+、-、前置--、后置--,前置++,后置++、==)
- 模拟实现库函数strstr
- 高通 MSM8K bootloader 之三: LK
- android和web扫描枪开发
- 【Unity3d游戏开发】浅谈Unity中的GC以及优化
- Android下拉刷新上拉加载控件(适用于所有View)
- C++ 递增运算符:前置++和后置++的区别
- 公司
- QLabel自动换行的实现
- Notification使用指导与规范(原理篇)
- 结构体中四字节对齐的详解
- linux线程池示例
- 关于Struct2中<s:textfield>的回显问题
- Android如何制作自己的依赖库上传至github供别人下载使用
- 跨域访问解决方案