运算符重载详解

运算符重载

提高程序的可读性

如果一个类没有提供赋值运算符,则默认提供一个 (浅拷贝)

如果一个类提供了拷贝构造函数,那么也要提供一个重载的赋值运算函数


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;
}

原文地址:https://www.cnblogs.com/zsq1993/p/6057181.html