原始url:
http://www.blog.edu.cn/user1/20989/archives/2006/1164139.shtml
1.函数重载
函数重载指一个标识符被用作多个函数抽象的名字,且能够通过函数的参数个数或参数类型将这些同名的函数区分开来,调用不发生混淆。
这样做的主要好处就是,不用为了对不同的参数类型或参数个数进行同样的功能操作而写多个函数(在C语言库函数中,用来计算绝对值的函数
就有abs,fabs,cabs,labs等等,其区别只在于参数不同)。如下面的代码中plus函数被重载。
//---------------------------------------------------------------------------
#i nclude <iostream.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
int Plus(int first,int second)
{
return first+second;
}
double Plus(double first,double second)
{
return first+second;
}
int main(int argc, char* argv[])
{
cout<<Plus(3,5)<<endl;
cout<<Plus(5.2,3.4)<<endl;
getchar();
return 0;
}
//---------------------------------------------------------------------------
2. 函数参数默认值
在C++中,可以在定义函数的同时给部分或全部参数设置默认值(注意:设置了默认值的参数右边所有参数必须也已经设置了默认值),这
样在调用函数时可以实现可变参数个数调用。如下面的代码:
//---------------------------------------------------------------------------
#i nclude <iostream.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
int Add(int first,int second,int third=0)
{
return first+second+third;
}
int main(int argc, char* argv[])
{
cout<<Add(3,4)<<endl;
cout<<Add(3,4,5)<<endl;
getchar();
return 0;
}
//---------------------------------------------------------------------------
运行结果分别为7和12。
3.综合上面的内容,可以得出一些结论
在对函数进行重载时,应遵循一定的原则:
1)保证重载的函数确实有不同的参数类型或不同的参数个数,不能仅以函数返回值不同而对函数进行重载。
2)重载函数进行不要改变函数的功能。
3)确保函数重载和函数参数默认值两种情况不发生冲突或歧义。
4.运算符重载
运算符重载也可以看作是一种函数重载。运算符重载往往在类的定义中需要。比如我们定义了“点”类,可能需要为其重载“+”“-”运
算符,使得这些运算符可以实现“点”类对象的加减操作。运算符重载一般有两种方式:
4.1 把运算符重载为类的成员函数
重载为类的成员函数时,隐含了一个参数,即this指针,指向调用该成员函数的对象的指针。如:
#i nclude <iostream.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
class POINT
{
private:
int x;
int y;
public:
POINT(){x=0;y=0;}
POINT(int xx,int yy){x=xx;y=yy;}
void Output(){cout<<endl<<"x="<<x<<endl<<"y="<<y<<endl;}
POINT operator +(const POINT &p){return POINT(x+p.x,y+p.y);}
POINT operator -(const POINT &p){return POINT(x-p.x,y-p.y);}
};
int main(int argc, char* argv[])
{
POINT p1(3,5);
POINT p2(4,6);
p1.Output();
p2.Output();
POINT p3,p4;
p3=p1+p2;
p4=p1-p2;
p3.Output();
p4.Output();
getchar();
return 0;
}
//---------------------------------------------------------------------------
运行结果为:
x=3
y=5
x=4
y=6
x=7
y=11
x=-1
y=-1
4.2 把运算符重载为友元函数
把运算符重载为类的友元函数,没有隐含的this指针参数。=、()、[]、->这几个运算符不能重载为友元函数。如:
//---------------------------------------------------------------------------
#i nclude <iostream.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
class POINT
{
private:
int x;
int y;
public:
POINT(){x=0;y=0;}
POINT(int xx,int yy){x=xx;y=yy;}
void Output(){cout<<endl<<"x="<<x<<endl<<"y="<<y<<endl;}
friend POINT operator +(const POINT p1,const POINT p2)
{
return POINT(p1.x+p2.x,p1.y+p2.y);
}
friend POINT operator -(const POINT p1,const POINT p2)
{
return POINT(p1.x-p2.x,p1.y-p2.y);
}
};
int main(int argc, char* argv[])
{
POINT p1(3,5);
POINT p2(4,6);
p1.Output();
p2.Output();
POINT p3,p4;
p3=p1+p2;
p4=p1-p2;
p3.Output();
p4.Output();
getchar();
return 0;
}
//---------------------------------------------------------------------------
运行结果为:
x=3
y=5
x=4
y=6
x=7
y=11
x=-1
y=-1
4.3 补充
其实还有很多内容,我只简单总结一点内容
4.3.1 运算符重载的两种方式不影响使用方式,只是实现不同
4.3.2对运算符进行重载时,应考虑下面的问题:
1)选择正确的运算符。例如为“日期”类进行“+”运算符的重载是没有意义的。
2)不可乱造运算符。重载的运算符必须是C++已有的。
3)对运算符重载后,不改变其原来的优先级和结合性。
4)重载运算符时,不得改变原运算符的操作数个数和语法结构。
5)程序中运算符重载不宜过多。