1 C++中前置操作符和后置操作符的重载
1.1 前置操作符和后置操作符的原生语义
下面的代码有区别吗?为什么?
在实际测试中发现,如上两行代码对应的汇编语句一摸一样。
我们需要知道如下事实:
- 现代编译器产品会对代码进行优化。
- 优化使得最终的二进制程序更加高效。
- 优化后的二进制程序失去了C/C++的原生语义。
- 不可能从编译后的二进制程序还原C/C++程序。
- C/C++开发的软件无法完全反编译。
1.2 ++操作符的重载
++操作符可以被重载:
- 全局函数和成员函数均可进行重载,推荐使用成员函数。
- 重载前置++操作符不需要额外的参数。
- 重载后置++操作符需要一个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;
}
Test operator ++ (int)
{
Test ret(mValue);
mValue++;
return ret;
}
};
int main()
{
Test t(0);
t++;
++t;
return 0;
}
1.3 前置++和后置++的真正区别
对于基础类型的变量:
- 前置++的效率与后置++的效率基本相同。
- 根据项目组编码规范进行选择。
对于类类型的对象:
- 前置++的效率高于后置++。
- 尽量使用前置++操作符提高程序效率。
参考资料: