在C++中,有两种重载,一种是函数的重载,另一种是运算符的重载。
C++的重载最早出现在基本运算符上。例如,加法操作只有一个运算符+,但是它却可以实现整数,浮点数,指针的加法运算。函数的重载与运算符的重载实现的效果一样,都是一种东西,实现相似的功能,只是在调用时,使用的参数的个数或类型上有不同。
函数的重载
如下,定义了4个函数,它们的名字都是:myMax(),但是,其中的参数各不相同,在调用函数时,通过判断函数中所给的参数的个数和类型来判断调用的是哪一个函数。
#include<iostream>
#include<cstring>
using namespace std;
int myMax(int x,int y); //比较两个整数
char myMax(char first,char second); //比较两个字符
double myMax(double u,double v); //比较两个小数
char * myMax(char * frist,char * second); //比较两个字符串
int main() //主函数
{
cout<<"in 3 and 5,the max number is "<<myMax(3,5)<<endl; //调用比较整数的函数
cout<<"in c and t the max char is:"<<myMax('c','t')<<endl; //调用比较字符的函数
cout<<"in 3.1 and -5.3,the max double number is:"<<myMax(3.1,-5.3)<<endl; //调用比较浮点数的函数
cout<<"in what and where the max string is:"<<myMax("what","where")<<endl; //调用比较字符的函数
}
//下面为函数体
int myMax(int x,int y) //比较两个整数
{
if(x>y) return x;
else return y;
}
char myMax(char first,char second) //比较两个字符
{
if(first>second) return first;
else return second;
}
double myMax(double u,double v) //比较两个小数
{
if(u>v) return u;
else return v;
}
char * myMax(char * first,char * second) //比较两个字符串
{
if(strcmp(first,second)>0) return first;
else return second;
}
运行的结果如下:
在函数重载时一定要注意的是:函数重载至少要在参数个数或参数类型上有所不同,否则在调用时,编译器无法区分到底调用的是哪个函数。
运算符的重载
运算符重载运行把标准运算符如:+ ,-,*,<等应用于定制数据类型的对象.为此,要编写一个函数,重新定义运算符,来说明重载后的运算符是如何使用的,起到什么作用.
重载给定运算符的函数名由关键字operator和要重载的运算符组成。
例如:现在需要一个空间三维点坐标相加的操作,需要重写+运算符,来实现两点直接相加。
#include<iostream>
using namespace std;
class Point //定义三维空间中的一个点
{
public:
Point(int i,int j,int k):x(i),y(j),z(k) {}; //点的构造函数
int x,y,z;
Point operator + (Point p2) //定义两个点相加的操作
{
x+=p2.x;
y+=p2.y;
z+=p2.z;
return Point(x,y,z);
}
};
int main()
{
Point P1(1,2,3);
Point P2(4,5,6);
Point P3(0,0,0);
P3=P1+P2; //将两个点相加,结果保存到P3中
cout<<P3.x<<endl;
cout<<P3.y<<endl;
cout<<P3.z<<endl;
return 0;
}
结果如下:
在上面的程序中,重写了+这个运算符,其中,参数只有一个点,因为这里返回的x,y,z,在实际运行时,是隐含了this指针的,所以运行结果实际是保存在了P1中。