您的位置:首页 > 编程语言 > C语言/C++

c++运算符重载

2015-09-24 15:45 337 查看
哪些操作符不能被重载?

::
. ->
.* ?:
这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;
}


下面对++运算符进行重载(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(){}
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>


注:

运算操作符重载把操作符的作用扩展到对象类型

为了访问类的保护对象,需要把重载函数定义为友元

操作符重载可以是成员函数

前增量和后增量通过一个形参区分
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: