---- 整理自狄泰软件唐佐林老师课程
问题
下面代码的区别?why?
1.1 编程实验
- 汇编中的处理是一样的,所以不可能从编译后的二进制程序还原
++i
还是i++
1.2 事实
- 现代编译器产品会对代码进行优化
- 优化使得最终的二进制程序更加高效
- 优化后的二进制程序丢失了C/C++的原生语义
- 不可能从编译后的二进制程序还原C/C++程序
- C/C++开发的软件无法完全反编译
1.3 思考
++操作符可以重载吗?如何区分前置++和后置++?
2. ++操作符可以被重载
- 全局函数和成员函数均可以进行重载
- 重载 前置++操作符 不需要额外的参数
- 重载 后置++操作符 需要一个int类型的占位参数
2.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 t(0);
t++;
++t;
return 0;
}
2.2 真正的区别
- 对于 基础类型 的变量:
- 前置++的效率与后置++的效率 基本相同
- 根据项目组编码规范进行选择
- 对于 类类型 的对象:
- 前置++的效率 高于 后置++
- 尽量使用前置++操作符提高程序效率
3. 小结
- 编译优化使得最终的可执行程序更加高效
- 前置++操作符和后置++操作符都可以重载
- ++操作符的重载必须符合其原生语义
- 对于基础类型,前置++和后置++的效率几乎相同
- 对于类类型,前置++的效率高于后置++