C++运算符的重载

运算符只能对特定的一些数据类型进行运算,运算符重载是让运算符能够对新定义的数据类型进行运算;如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)
{

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值