您的位置:首页 > 编程语言 > C语言/C++

函数重载总结

2016-05-06 13:13 225 查看
函数重载

函数重载的定义是:在相同的作用域中,如果函数具有相同名字而仅仅是形参表不同,此时成为函数重载。注意函数重载不能基于不同的返回值类型进行重载。

注意函数重载中的“形参表”不同,是指本质不同,不要被一些表象迷惑。main函数不能被重载。

重载确定的三个步骤:

1,候选函数

2,选择可行函数

3,寻找最佳匹配

4,含有多个形参的重载确定

下面三组定义本质是相同的,不是重载:

1)int sum (int &a); 和 int sum (int &);

2)  int sum (int a) 和 int sum (const int a);

3)typedef int DD;

     int sum(int a); 和 int sum (DD a);

其中第二个例子对于非引用传参,形参是否const是等价的。但是当使用引用传参时,有无const是不同的。使用指针传参时,指向const对象的指针和指向非const对象的指针做形参的函数是不同的。

基于const的重载。

结论:仅当形参是引用或者指针时,形参是否为const才有影响。

可以基于函数的引用形参是指向const对象还是指向非const对象,来实现函数重载。

注意不能基于指针本身是否为const来实现函数的重载:

f(int *);

f(int * const) //redeclaration

此时,const 用于修饰指针本身,而不是修饰指针所指向的类型。在上面两种情况中,都复制了指针,指针本身是否是const并没有带来区别。当形参以副本传递时,不能基于形参是否为const来实现重载。

在类中会有这样一种重载,它是合法的。

Class A {

int function ();

int function () const;

};

可以看到在A类中,function函数是发生重载了,而且是合法的。而且在调用时,只用A类的const对象才能调用const版本的function函数,而非const对象可以调用任意一种,通常非const对象调用不是const版本的function函数。

原因是:按照函数重载的定义,函数名相同而形参表有本质不同的函数称为重载。在类中,由于隐含的this形参的存在,const版本的 function函数使得作为形参的this指针的类型变为指向const对象的指针,而非const版本的使得作为形参的this指针就是正常版本的指 针。此处是发生重载的本质。重载函数在最佳匹配过程中,对于const对象调用的就选取const版本的成员函数,而普通的对象调用就选取非const版 本的成员函数。

(注:this指针是一个const指针,地址不能改,但能改变其指向的对象或者变量)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++