40-前置操作符和后置操作符
值得思考的问题
下面的代码有没有区别?为什么?
i++; // i的值作为返回值,i自增1
++i; // i自增1,i的值作为返回值
【范例代码】真的有区别吗?
#include <iostream>
#include <string>
using namespace std;
int main(int argc, const char* argv[]) {
int i = 0;
i++;
++i;
return 0;
}
意想不到的事实
- 现代编译器产品会对代码进行优化
- 优化使得最终的二进制程序更加高效
- 优化后的二进制程序丢失了C/C++的原生语义
- 不可能从编译后的二进制程序还原C/C++程序
【注意】C/C++开发的软件无法完全反编译。
【问题】++操作符可以重载吗?如何区分前置++和后置++?
++操作符重载
++操作符可以被重载(--操作符一样):
- 全局函数和成员函数均可进行重载
- 重载前置++操作符不需要额外的参数
- 重载后置++操作符需要一个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(int argc, const char* argv[]) {
Test t(0);
t++;
++t;
return 0;
}
真正的区别
对于基础类型的变量:
- 前置++的效率与后置++的效率基本相同
- 根据项目编码规范进行选择
对于类类型的对象:
- 前置++的效率高于后置++
- 尽量使用前置++操作符提高程序效率