运算符只能对特定的一些数据类型进行运算,运算符重载是让运算符能够对新定义的数据类型进行运算;如dt是date类的对象,语句dt++是错误的,因为date类是刚定义的新的数据类型,其中没有定义“++”运算符;
在C++中对运算符进行重载时要注意以下问题:
a.一般不改变运算符原有含义,只让他能够对新的数据类型进行运算;
b.重载运算符时不能改变运算符原有的优先级别,也不能改变运算符需要的操作数的数目;
c.有些运算符不能重载,如类成员运算符“.”,类指向运算符“*”,类作用域分解运算符“::”,条件运算运算符“?:”等;
d.不能人为定义新的运算符,只能使用系统提供的原有运算符;
一:二元算数运算符的重载
(一)重载为类的成员函数
1.在类中可以将运算符的功能定义为一个成员函数,即将运算符重载为类的成员函数,实现运算符功能的成员函数称为成员运算符函数,简称运算符函数;
如果让运算符函数能够访问类的私有数据成员,那么必须将运算符函数声明为类的成员函数或类的友元函数。(类的非静态成员函数都带有this指针,类友元函数没有this指针);
2.在类中定义运算符函数时应注意以下问题:
a.对于一元运算符函数,用友元函数重载运算符时,需要声明一个形参,若用成员函数重载运算符时,则不能再声明形参,这个形参由成员函数的this指针提供;
b.对于二元运算符函数,用友元函数重载运算符时,需要声明两个形参,若用成员函数重载运算符时,则需声明一个形参,这个形参表示运算符的右操作数,左操作数由成员函数的this指针提供;
例:
#include <iostream.h>
static int dys[]={31,28,31,30,31,30,31,31,30,31,30,31} ;
/* run this program using the console pauser or add your own getch, system(“pause”) or input loop /
using namespace std;
class date
{int mo,da,yr;
public:
date(int m,int d,int y)
{
mo=m;da=d;yr=y;
}
date(){}
void display()
{
cout<<mo<<"/"<<da<<"/"<<yr<<endl;
}
date operator +(int day)//重载“+”运算符斜体样式
{
date dt=this;
day+=dt.da ;
while(day>dys[dt.mo-1])
{
day-=dys[dt.mo-1];
if(++dt.mo==13)
{
dt.mo=1;
dt.yr++;
}
}
dt.da=day;
return dt;
}
};
int main(int argc, char argv)
{
date olddate(2,20,99);
date newdate;
newdate=olddate+21;
newdate.display() ;
return 0;
}
3/13/99
Process exited after 0.1133 seconds with return value 0
请按任意键继续. . .
(二)重载为类的友元函数
需按正确的顺序指明两个操作数;
例:
#include
static int dys[]={31,28,31,30,31,30,31,31,30,31,30,31} ;
/* run this program using the console pauser or add your own getch, system(“pause”) or input loop /
using namespace std;
class date
{int mo,da,yr;
public:
date(int m,int d,int y)
{
mo=m;da=d;yr=y;
}
date(){}
void display()
{
cout<<mo<<"/"<<da<<"/"<<yr<<endl;
}
friend date operator +(int,date&);
date operator +(int day)
{
date dt=this;
day+=dt.da ;
while(day>dys[dt.mo-1])
{
day-=dys[dt.mo-1];
if(++dt.mo==13)
{