c++之运算符重载

          运算符可以重载,运算符重载的含义是对已有的运算符进行重新定义,使它具有一种新功能。运算符重载并不是定义一种新的运算符。运算符重载的目的是为了满足某种操作的需要,在原有运算符实现不了,又不增加新的运算符种类的基础上,对含义相近的运算符进行重载。

       运算符重载注意:

       1,哪些运算符可以重载?

        大多数运算符都可以重载,只有少数的运算符不能重载。不能重载的运算符有四种:.  .*  ::  ? :  其余的运算符都可以进行重载。

       2,运算符重载遵循着“四个不变”原则:运算符重载后,将保持原来运算符的4个特性不变。

       优先级不变,结合性不变,操作数个数不变,语法结构不变

       3,编译程序如何选择重载运算符?

       运算符重载实际上是通过定义一个函数实现的。运算符重载归根结底是函数的重载。编译程序选择重载的运算符遵循函数重载的选择原则,即按不同类型或个数的参数来选择不同的重载运算符。具体的说,选择重载的运算符是由操作数的类型决定的。

       4,运算符重载函数的两种形式:

       运算符通常是针对类中私有成员的操作,因此,运算符重载函数应该能够访问类中的私有成员。所以,运算符重载函数一般有两种形式,成员函数形式和友元函数形式。

       运算符重载为成员函数形式

       成员函数形式的运算符重载函数的定义格式:

        <类型>  operator  <运算符>  ( <参数表> )

        {...}

        其中,operator是定义运算符重载函数所需要的关键字,<运算符>是被重载的运算符,<参数表>中的参数个数与重载的运算符操作数的个数有关,一般,单目运算符采用成员函数形式重载时,该<参数表>无参数,双目运算符采用成员函数形式重载时,该<参数表>中有一个参数。在使用该形式的运算符重载函数中,调用该函数的对象为第一操作数,对双目运算符而言,<参数表>中的参数为第二操作数。

        当运算符重载为成员函数时,实际上隐含了一个参数,该参数是this指针,即指向该成员函数的对象的指针。

        运算符重载为友元函数的形式

        运算符重载可以定义为友元函数的形式的格式:

         friend  <类型>  operator  <运算符>  ( <参数表> )

         {...}

         对双目运算符来说,被重载为友元函数形式的运算符重载函数有两个形参,对单目运算符来说,被重载为友元函数形式的运算符重载函数有一个形参。

          两种重载形式的比较

         一般,单目运算符重载常用成员函数的形式,而双目运算符重载常选用友元函数形式。

         例一:赋值运算符重载为成员函数形式

<span style="font-size:18px;">#include <iostream>
using namespace std;
class A
{
public:
	A()
	{ X=Y=0; }
	A(int a,int b)
	{ X=a;Y=b; }
	A(A &p)
	{ X=p.X;Y=p.Y; }
	A& operator =(A &p);//赋值运算符重载函数
	int GetX()
	{ return X; }
	int GetY()
	{ return Y; }
private:
	int X,Y;
};
A& A::operator =(A &p)//运算符重载函数体
{
	X=p.X;
	Y=p.Y;
	cout<<"Assignment operator called.\n";
	return *this;
}
int main()
{
	A a1(72,81);
	A a2;
	a2=a1;//重载运算符
	cout<<a2.GetX()<<","<<a2.GetY()<<endl;
	int b;
	b=9;//一般的赋值运算符
	cout<<a1.GetX()+b<<","<<a1.GetY()-b<<endl;
    return 0;
}</span>

       程序分析:

       1,运算符重载函数有一个参数,参数是类A对象的引用,函数的返回值也是类A对象的引用。

       2,a2=a1;这条语句是被重载函数的应用。

       3,b=9; 这是正常的赋值运算符。

       因此输出的结果为:Assignment operator called.

                                       72, 81

                                       81, 72

       例二:下标运算符重只能载为成员函数形式,并且只能有一个参数。

                   C++语言规定:=,[],(),->必须重载为成员函数形式。

       例三;函数调用运算符()重载(是下标运算符[]的扩展),可有多个参数

<span style="font-size:18px;">#include <iostream>
using namespace std;
class Fun
{
public:
	double operator ()(double x,double y) const//运算符重载函数
	{
		return (x*x+5*x-8)*(y+5);
	}
};
int main()
{
	Fun f1,f2;
	cout<<f1(1.5,2.0)<<endl;
	cout<<f2(2.1,1.0)<<endl;
	return 0;
}</span>

          结果为:12.25

                     41.46

 


 

 

 

 

 

      

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值