运算符重载详解
运算符重载
提高程序的可读性
如果一个类没有提供赋值运算符,则默认提供一个 (浅拷贝)
如果一个类提供了拷贝构造函数,那么也要提供一个重载的赋值运算函数
Person& Person::operator=(const Person &other)
{
if(this==&other)
return *this;
delete[]m_data;
int length=strlen(other.m_data);
m_data=new char[length+1];
strcpy(m_data,other.m_data);
return *this;
}
C++语言规定
1重载的运算符要保持有原有运算符的意义
2.只能对已有的运算符重载,不能增加新的运算符
3.重载该的运算符不会改变原先的优先级和结合性
运算符重载的形式
成员函数
友元函数
RMB operator+(const RMB& s1,const RMB& s2)
{
unsigned int jf=s1.jf+s2.jf;
unsigned int yuan=s1.yuan+s2.yuan;
RMB reult(yuan,jf);
return result;
}
RMB operator>(const RMB& s1,const RMB& s2)
{
bool ret=false;
if(s1.yuan>s2.yuan)
return true;
else if(s1.yuan==s2.yuan)
{
if(s1.jf>s2.jf)
return true;
}
return ret;
}
运算符重载作为成员函数
作为成员的运算符比之作为非成员函数的运算符,在声明和定义时,
在形式上少一个参数。
RMB RMB::operator+(const RMB& s)
{
unsigned int c=jf+s.if;
unsigned int d=yuan+s.yuan;
return RMB(c,d);
}
C++规定:=,(),[],->这四种运算符必须为成员函数形式
++和--运算符重载
前增量和后增量的区别
使用前增量时,对对象(操作数)进行增量修改,然后再返回该对象
使用后增量时,必须在对象之前返回原有的对象值
class Increase
{
public:
Increase(int x):value(x){}
Increase& operator++(); //前增量
Increase operator++(int); //后增量 int这里没有什么意义 是规定 只是为了区别前后增量
/*前增量和后增量操作的意义,决定了其不同的返回方式。
前增量运算符返回引用,后增量运算符返回值*/
private:
int value;
}
++成员函数 的实现
Increase& Increase::operator++()
{
value++; //前增量
return *this; //再返回原对象
}
Increase Increase::operator++(int)
{
Increase temp(*this); //临时对象存放原有对象值
value++; //原有对象增量修改
return temp;
}
++的非成员形式的重载
friend Increase& operator++(Increase &); //前增量
friend Increase operator++(Increase &,int); //后增量
friend Increase& operator++(Increase &a)
{
a.value++;
return a;
}
friend Increase operator++(Increase &a,int)
{
Increase temp(a);
a.value++;
return temp;
}