前置操作符与后置操作符
思考:
i ++; // i的值作为返回值,i自增1;
++1;// i自增1,i的值作为返回值;
意想不到的事实
1、现代的编译器产品会对代码进行优化;
2、优化使得最终的二进制程序更加高效;
3、优化后的二进制程序丢失了C/C++的原生语义;
4、不可能从编译后的二进制程序还原C/C++程序;
++操作符可以被重载
1、全局函数和成员函数均可进行重载;
2、重载前置++操作符不需要额外的参数;
3、重载后置++操作符需要一个int类型的占位参数。
实例分析:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
class Test
{
int m_value;
public:
Test(int i)
{
m_value = i;
}
int getValue()
{
return m_value;
}
//前置++重载
Test& operator ++ ()
{
++m_value;
return *this;
}
//后置++重载
Test operator ++ (int)
{
Test ret(m_value); //保存当前对象的值
m_value++;
return ret;
}
};
int main()
{
Test t(0);
cout << t.getValue() << endl;
Test tt = t++;
cout << tt.getValue() << endl;
//t++;
cout << t.getValue() << endl;
return 0;
}
真正的区别
对于基础类型的变量
1、前置++的效率与后置++的效率基本相同;
2、根据项目组编码规范进行选择;
对于类类型的对象
1、前置++的效率高于后置 ++ ;
2、尽量使用前置++ 操作符提高程序效率;
小结
1、编译优化使得最终的可执行程序更加有效;
2、前置++操作符和后置++操作符都可以被重载;
3、++操作符的重载必须符合其原生语义;
4、对于基础类型,前置++ 与后置++的效率几乎相同;
5、对于类类型,前置j++的效率高于后置++;