问:
考无忧小编解答:
在重载运算符的原则中说到,要保持运算符的可交换性。而上面的程序只允许Date类对象在运算符的左边而整型值在右边,不支持下面的语句:
Date newdate=100+olddate;
所以,仅仅靠一个类的成员重载运算符是无法实现上面功能的。对重载双目运算符的类成员函数来说,总是认定调用函数的对象位于运算符左边。不过,我们可以再写一个非类成员的重载运算符函数,可以规定Date类的对象在运算符右边,而别的类型在运算符左边。例如,我们可以这样在类的外部定义一个函数:
Date operator + (int n,Date & dt)
下面代码在原先的基础上增加了一个非类成员函数来实现双目加法运算符的重载。
#include iostream.h
class Date
{
int mo,da,yr;
static int dys[];
public:
Date(int m=0,int d=0,int y=0)
{ mo=m; da=d; yr=y;}
void display() const
{ cout < Date operator + (int) const;
};
int Date::dys[]={31,28,31,30,31,30,31,31,30,31,30,31};
Date Date::operator+(int) const
{
Date dt=*this;
n+=dt.da;
while(n >=dys[dt.mo-1])
{
n-=dys[dt.mo-1];
if(++dt.da==13)
{
dt.mo=1;
dt,yr++;
}
}
dt.da=n;
return dt;
}
Date operator + (int n,Date & dt)
{
return dt+n;
}
int main()
{
Date olddate(1,1,2005);
Date newdate;
newdate=olddate+100;
newdate.display();
return 0;
}
上面的例子中非类成员重载运算符函数调用了类中的重载+运算符来实现加法运算。如果类当中没有提供这样的函数,那么非类成员的重载运算符函数将被迫访问类的私有数据来实现加法运算。这样的话,需要把这个函数声明为类的友元,如下:
class Date
{
friend Date operator + (int n,Date &);
};
上例中重载运算符函数声明了全部两个参数,这是因为它不是类的成员,因此它不能作为类的成员函数被调用,就缺少了一个隐含的参数。
第一个重载加法运算符函数也可以用类的友元函数来实现。作为一种约定,这通常把所有为类重载的运算符都设定为该类的友元。
例子中只给出了重载加法的代码,我们同样可以来重载减法,乘除法等等。
考无忧小编推荐:
更多计算机等级考试真题及答案>>>点击查看
想知道更多关于计算机等级报考指南、考试时间和考试信息的最新资讯在这里>>>点击查看