c++运算符重载

哪些操作符不能被重载?

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


注:

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

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

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

前增量和后增量通过一个形参区分

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值