为什么前缀++/--比后缀++/--的效率高?
来源:互联网 发布:剑网3英气军娘捏脸数据 编辑:程序博客网 时间:2024/06/02 07:56
首先切记一句话:前缀++比后缀++的效率高,返回引用的效率比返回对象的效率高,所以前缀++返回引用,后缀++返回对象。
对于内置类型和当代的编译器而言,这看似不是什么问题。然而,C++允许您针对类定义这些运算符,在这种情况下,用户这样定义前缀函数:将值加1,然后返回结果;但后缀版本首先复制一个副本,将其加1,然后将复制的副本返回。因此,对于类而言,前缀版本的效率比后缀版本高。
总之,对于内置类型,采用哪种格式不会有差别,但对于用户定义的类型,如果有用户定义的递增和递减运算符,则前缀格式的效率更高。
在句法上,重载函数是通过它们的参数类型的差异区分的,但是不管是前缀形式还是后缀形式的自增和自减都没有参数,我们到底该怎么区分它们呢?在开始时,C++在语法上面确实是存在这个问题的,程序员对此颇有微词。后来C++中加了一些特性来解决这个问题。
C++规定后缀形式有一个int类型的参数,当函数被调用时,编译器传递一个0作为int参数的值给该函数。
且看下面的小程序:
#include <iostream> class MyInt{ public: MyInt(int a):i(a) { } MyInt& operator++(); // prefix ++ const MyInt operator++(int); // postfix ++ MyInt& operator--(); // prefix -- const MyInt operator--(int); // postfix -- friend std::ostream& operator<<(std::ostream&,const MyInt&); private: int i;}; MyInt& MyInt::operator++(){ this->i++; return *this;} const MyInt MyInt::operator++(int){ const MyInt temp = *this; ++(*this); return temp;} std::ostream& operator<<(std::ostream& out,const MyInt& t){ out << t.i ; return out;} int main(){ MyInt a(0); a++; std::cout << a << std::endl; // i = 1,print 1 ++a; std::cout << a << std::endl; // i = 2,print 2 std::cout << a++ << std::endl; // i = 3,print 2 std:: cout << ++a << std::endl; // i = 4,print 4 return 0;}
看上面的程序可以发现以下几点:
1.
2.
MyInt t(1);
t++++;
这样的形式将是正确的,这显然不是我们期望的。另外,只要看上面的后缀形式的定义即可知道,这样写t只是增加了1而不是我们期望的2,为什么呢?因为第二次的调用是用第一次返回的对象来进行的,而不是用t,它违反了俺们程序员的直觉。因此,为了阻止这些行为,我们返回const对象。
3.
以上就是自增\自减操作符重载的前缀和后缀形式,我们只要记住那个参数规定和返回值形式,就很容易掌握啦
- 为什么前缀++/--比后缀++/--的效率高?
- 为什么前置++比后置++的效率高
- 栈的效率为什么比堆高?
- 为什么switch的效率要比 if else 高?
- 为什么DCDC的效率一般情况下要比LDO高
- 前置++为什么比后置++效率高
- 前置++为什么比后置++效率高
- vector_map 为什么比map效率高
- 前置++为什么比后置++效率高
- 前置++为什么比后置++效率高
- 栈为什么效率比堆高
- 堆和栈的区别以及衍生出来的栈的效率为什么比堆高
- 堆和栈的区别以及衍生出来的栈的效率为什么比堆高
- 为什么自增(increment)运算符的 前置(prefix) 比 后置(postfix) 效率高?
- 为什么自增(increment)运算符的 前置(prefix) 比 后置(postfix) 效率高?
- 为什么存储过程比sql语句效率高?
- StringBuilder效率比String高的原因。
- 为什么java效率比c/c++低?为什么用jni调用效率高?
- leetcode 日经贴,Cpp code -Evaluate Reverse Polish Notation
- 简述RFID系统的时隙ALOHA算法的工作过程。
- android学习之(2)----自定义View
- 第八周项目零(3):阅读程序:运算符重载
- UIImage图片处理 — 截图(capture), 缩放(scale), 设定大小(resize), 存储(save)
- 为什么前缀++/--比后缀++/--的效率高?
- 子窗体显示
- 世界怎样存在---唯物辩证法
- Android:异步任务基础
- MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片
- 慕课网的HTML和CSS学习。【一】
- 李白打酒
- linux关闭进程,服务
- 欢迎使用CSDN-markdown编辑器