本文主要是介绍C++重载——前置操作符和后置操作符重载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本文参照于狄泰软件学院,唐佐林老师的——《C++深度剖析教程》
思考:“i++“ 和 ”++i“有区别吗?为什么?
我们通过反汇编验证一下想法:
16 int i = 0;
0804869d: movl $0x0,0x1c(%esp)
18 i++;
080486a5: addl $0x1,0x1c(%esp)
20 ++i;
080486aa: addl $0x1,0x1c(%esp)
我们可以发现:i++和++i所对应的汇编代码是一样的。
这实际上是编译器帮我们做了优化:
1. 现代编译器产品会对代码进行优化
2. 优化使得最终的二进制程序更加高效
3. 优化后的二进制程序丢失C/C++的原生语义
4. 不可能从编译器后的二进制程序还原C/C++程序。
重载后的前置操作符和后置操作符
思考:++操作符可以重载吗?如何区分前置++和后置++?
- 后置++的意义为:将变量的值作为返回值,然后变量自增1;
- 前置++的意义为:将变量的值自增1,然后变量的值作为返回值。
那么我们该如何实现++操作符的重载函数呢?
示例代码:++操作符的重载
#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 t1(0);Test t2(0);t1++; cout << "++t1; = " << t1.value() << endl;++t2;cout << "++t2; = " << t2.value() << endl;Test t3 = t1++;cout << "Test t3 = t1++; = " << t3.value() << endl;Test t4 = ++t2;cout << "Test t4 = ++t2; = " << t4.value() << endl;return 0;
}
输出结果:
++t1; = 1
++t2; = 1
Test t3 = t1++; = 1
Test t4 = ++t2; = 2
分析:
1. 全局函数和成员函数均可进行重载++操作符
2. 重载前置++操作符不需要额外的参数
3. 重载后置++操作符需要一个int类型的占位参数
问题:那么重载后和重载前有什么区别呢?
(1) 对于基础类型的变量
1. 前置++的效率和后置++的效率基本相同
2. 根据项目中编码规范进行选择
(2) 对于类类型的对象
1. 前置++的效率高于后置++
2. 尽量使用前置++操作符提高程序效率。
这篇关于C++重载——前置操作符和后置操作符重载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!