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