哪些操作符不能被重载?
:: . -> .* ?: 这5个符号不能被重载
注意: 1:重载运算符要保持原运算符的意义
2:只能对已有的运算符重载,不能增加新运算符
3:重载的运算符不会改变原先的优先级和结合性
4:重载的运算符不能有默认参数
为什么要运算符重载? c++中预定义的运算符的操作对象只能是基本数据类型,但是有时候我们需要对我们定义的类进行类似的运算操作,这时候,就需要用到运算符重载!
一般格式:<返回值说明符> operator <运算符符号>(<参数表>)
{
< 函数体>
}
成员函数运算符:<函数类型> operator <运算符>(<参数表>)
{
<函数体>
}
一般运算符重载:
#include<iostream>
using namespace std;
class RMB
{
private:
int yuan;
int jiao;
public:
RMB(){yuan=0;jiao=0;}
RMB(int x,int y):yuan(x),jiao(y){}
~RMB(){}
void display()
{
cout<<yuan<<"元"<<jiao<<"角"<<endl;
}
friend RMB operator+(const RMB&x,const RMB& y); <span style="color:#ff0000;">//将其设为友元函数</span>
};
RMB operator+(const RMB& x,const RMB& y) <span style="color:#ff0000;">//类外实现+运算符重载 不能返回引用,因为temp是局部变量,用后即不存在</span>
{
RMB temp;
temp.yuan=x.yuan+y.yuan;
temp.jiao=x.jiao+y.jiao;
return temp;
}
int main()
{
RMB r1(1,1);
RMB r2(2,2);
RMB r3;
r3=r1+r2;
r3.display();
return 0;
}
成员函数运算符重载:
#include<iostream>
using namespace std;
class RMB
{
private:
int yuan;
int jiao;
public:
RMB(){yuan=0;jiao=0;}
RMB(int x,int y):yuan(x),jiao(y){}
~RMB(){}
void display()
{
cout<<yuan<<"元"<<jiao<<"角"<<endl;
}
RMB operator+(const RMB& x) <span style="color:#ff0000;">//类内部实现运算符重载</span>
{
RMB temp;
temp.yuan=yuan+x.yuan;
temp.jiao=jiao+x.jiao;
return temp;
}
};
int main()
{
RMB r1(1,1);
RMB r2(2,2);
RMB r3;
r3=r1+r2;
r3.display();
return 0;
}
一般运算符重载:
#include<iostream>
using namespace std;
class RMB
{
private:
int yuan;
int jiao;
public:
RMB(){yuan=0;jiao=0;}
RMB(int x,int y):yuan(x),jiao(y){}
~RMB(){}
friend RMB& operator++( RMB& x);
friend RMB operator++(RMB& x,int);
void display()
{
cout<<yuan<<"元"<<jiao<<"角"<<endl;
}
};
RMB& operator++( RMB & x ) <span style="color:#ff0000;">// ++x;</span>
{
x.jiao++;
if(x.jiao>=10)
{
x.jiao-=10;
x.yuan+=1;
}
return x;
}
RMB operator++(RMB& x,int) <span style="color:#ff0000;">//x++ 这个地方不能返回引用,int是为了区别前增量与后增量,没有其他用处</span>
{
RMB temp; <span style="white-space:pre"> </span><span style="color:#ff0000;">//先用临时变量记录,然后返回临时变量</span>
temp=x;
x.jiao++;
if(x.jiao>=10)
{
x.jiao-=10;
x.yuan+=1;
}
return temp;
}
int main()
{
RMB r1(2,9);
++r1;
r1.display();
r1++;
r1.display();
return 0;
}
<span style="color:#ff6600;">skywalker@skywalker:~/work/test$ ./a.out
3元0角
3元1角</span>
类成员运算符重载x++与++x :
#include<iostream>
using namespace std;
class RMB
{
private:
int yuan;
int jiao;
public:
RMB(){yuan=0;jiao=0;}
RMB(int x,int y):yuan(x),jiao(y){}
~RMB(){}
void display()
{
cout<<yuan<<"元"<<jiao<<"角"<<endl;
}
RMB& operator++() <span style="color:#ff0000;">//++x; 返回引用</span>
{
jiao++;
if(jiao>=10)
{
jiao-=10;
yuan++;
}
return *this; <span style="color:#ff0000;">//返回this指针</span>
}
RMB operator++(int) <span style="color:#ff0000;">//x++; 不能返回引用</span>
{
RMB temp;
temp=*this; <span style="color:#ff0000;"> //将this内容给临时变量</span>
jiao++;
if(jiao>=10)
{
jiao-=10;
yuan++;
}
return temp;
}
};
int main()
{
RMB r1(2,9);
++r1;
r1.display();
r1++;
r1.display();
return 0;
}
<span style="color:#ff9900;">skywalker@skywalker:~/work/test$ ./a.out
3元0角
3元1角
</span>
注:
运算操作符重载把操作符的作用扩展到对象类型
为了访问类的保护对象,需要把重载函数定义为友元
操作符重载可以是成员函数
前增量和后增量通过一个形参区分