运算符重载的机制是不能改变原有运算符的逻辑。
前置++(++i)的处理逻辑是本身先相加,再返回本身。
比如
int a=10;
++a=20;
编译正确,a的值为20.
后置++(i++)的处理逻辑是本身先生成一个临时量,先使用临时量(常量),表达式结束,本身再++。
int a=10;
a++=20;
编译错误,报错:error C2106: “=”: 左操作数必须为左值
#include<iostream>
class CInt
{
public:
CInt(int val)
:mvalue(val)
{
}
bool operator<(int rhs)
{
return mvalue<rhs;
}
CInt& operator++()//前置++
{
++mvalue;
return *this;
}
const CInt operator++(int)//后置++
{
CInt tmp(*this);
mvalue++;
return tmp;
}
int& operator[](int* parr)
{
return parr[mvalue];
}
private:
int mvalue;
};
int main()
{
int arr[]={1,2,65,22,78};
int len=sizeof(arr)/sizeof(arr[0]);
CInt c(20);
std::cout<<(c<10)<<std::endl;//0
for(CInt i=0;i<len;i++)
{
std::cout<<i[arr]<<" ";
}
std::cout<<std::endl;
return 0;
}
不仅能重载运算符,也能重载类型,但是不建议使用类型的重载。比如上面遍历数组时,若按照arr[i]的形式来访问,则类中的函数改为如下,也是可以成功遍历的:
operator int()
{
return mvalue;
}
此时程序对arr[i]的处理相当于arr[i.operator int () ],所以可以成功调用。