本文参照于狄泰软件学院,唐佐林老师的——《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. 尽量使用前置++操作符提高程序效率。