---- 整理自狄泰软件唐佐林老师课程
1. 问题
- 下面代码的区别?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);
Test tt = ++t; // 1
cout << "tt.value() = " << tt.value() << endl;
tt = t++; // tt-->1, t-->2
cout << "tt.value() = " << tt.value() << endl;
cout << "t.value() = " << t.value() << endl;
return 0;
}
2.2 真正的区别
- 对于 基础类型 的变量:
- 前置
++
的效率与后置++
的效率 基本相同 - 根据项目组编码规范进行选择
- 前置
- 对于 类类型 的对象:
- 前置
++
的效率 高于 后置++
- 尽量使用前置
++
操作符提高程序效率
- 前置
3. 小结
- 编译优化使得最终的可执行程序更加高效
- 前置
++
操作符和后置++
操作符都可以重载 ++
操作符的重载必须符合其原生语义- 对于基础类型,前置
++
和后置++
的效率几乎相同 - 对于类类型,前置
++
的效率高于后置++