重载的基本概念
在非面向对象的过程化语言中,要不每个过程或函数必须具有惟一的调用名,否则会导致编译错误。面向对象程序设计语言提供使用同一函数名的机制,通过参数个数的不同或类型的不同来选择使用相应的代码,这就是的函数的重载。
重载函数可分为
1) 参数个数不同的重载
2) 参数类型不同的重载
3) 参数顺序不同的重载
运算符重载
C++语言允许程序员重新定义已预定义的运算符,使其能按用户的要求具有新的含义,这就是所谓的运算符重载。
运算符重载的格式
运算符重载的形式有两种:重载为类的成员函数和重载为类的友元函数
运算符重载为类的成员函数的语法形式如下:
<函数类型> operator <被重载的运算符><形参表>
{
<函数体>;
}
运算符重载为类的友元函数的语法形式如下:
friend <函数类型> operator <被重载的运算符><形参表>
{
<函数体>;
}
一般来讲,单目运算最好重载为成员函数,而双目运算符则最好重载为友元函数。
重载为成员函数
例:
#include<iostream.h>
class Time
{
private:
int hours,minutes,seconds;
public:
Time()
{
hours=0;minutes=0;seconds=0;
}
Time(int h, int m, int s)
{
hours=h; minutes=m; seconds=s;
}
Time operator +(Time &);
void gettime();
};
Time Time::operator +(Time & time)
{
int h,m,s;
s=time.seconds+seconds;
m=time.minutes+minutes;
h=time.hours+hours;
Time result(h,m%60,s%60);
return result;
}
void Time::gettime()
{
cout<<hours<<":"<<minutes<<":"<<seconds<<endl;
}
void main()
{
Time t1(8,51,40),t2(4,15,30),t3;
t3=t1+t2;
t3.gettime;
}
操作符重载为友元函数形式
#include<iostream.h>
class Time
{
private:
int hours,minutes,seconds;
public:
Time(){ hours=0; minutes=0; seconds=0; }
Time(int h, int m, int s)
{
hours=h; minutes=m, seconds=s;
}
friend Time operator +(Time &, Time &);
void gettime();
};
Time operator +(Time &time1, Time &time2)
{
int h,m,s;
s=time1.seconds+time2.seconds;
m=time1.minutes+time2.minutes+s/60;
h=time1.hours+time2.hours+m/60;
Time result(h,m%60,s%60);
return result;
}
void Time::gettime()
{
cout<<hours<<":"<<minutes<<":"<<seconds<<endl;
}
void main()
{
Time t1(8,51,40),t2(4,15,30),t3;
t3=t1+t2;
t3.gettime();
}
何时应该用成员函数,何时用友元函数来访问类的私有部分。
这地是要注意的地方:
(1)构造函数、析构函数和虚函数运算必须用成员函数;
(2)若运算符的操作需要修改类对象在状态,则它应该是成员函数,而不是友元函数;
(3)需要左值操作数的运算符(如:=、+=、++)的重载最好用成员函数;
(4)如果运算符所需的操作数(尤其是第一个操作数)希望在隐式类型转换,则该运算符重载必须用友元,而不是成员函数;
(5)不能用友元函数重载的运算符有:=;();[];->,其余运算符都可以使用友元来实现重载。