1. 函数重载定义
函数名相同,参数表不同的一组函数。这样的一组函数之间称为重载
示例中load函数有四个版本,彼此构成重载关系
1.1 参数类型/个数不同形成重载
//overload.cpp
#include <iostream>
using namespace std;
void load (int)
{
cout << "load int version" << endl;
}
void load(double)
{
cout << "load double version" << endl;
}
void load(int a , int b)
{
cout << "load int, int version" << endl;
}
void load(int a, double)
{
cout << "load int, double version" << endl;
}
int main ()
{
load(99);
load(99.9);
load(99,99);
load(99, 99.9);
return 0;
}
以上示例代码输出为:
load int version
load double version
load int, int version
load int, double version
使用g++编译出以上四个重载关系的函数,nm a.out 显示其函数表如下:
0000000000400870 T _Z4loadd
0000000000400846 T _Z4loadi
00000000004008c9 T _Z4loadid
000000000040089c T _Z4loadii
不难猜测,编译器根据函数调用时参数的类型决定调用哪一个函数。
1.2 参数常属性不同形成重载
最佳匹配:
非常实参 匹配非常形参版本
常实参匹配常形参版本
其次:
当非常实参参与调用,但是没有非常形参函数声明时。常形参版本可以形成非常实参的匹配(本例没有做代码说明)
#include <iostream>
using namespace std;
class HeyBaby{
public:
void baby_show(int& toy)
{
cout << "baby play with toy, toy could be damaged!!!" << endl;
}
void baby_show (int const& toy)
{
cout << "baby play with toy, toy could not be damaged!!!" << endl;
}
};
int main (void)
{
int val1 = 1;
int const val2 = 2;
HeyBaby Baby(100,99);
Baby.baby_show(val1);
Baby.baby_show(val2);
return 0;
}
1.3 部分函数修饰符不同,也会形成重载
this 指针的常属性也成为函数重载的原因
#include <iostream>
using namespace std;
class Eg {
public:
int show (void)const {
cout << "const version show" << endl;
return 10;
}
int show (void) {
cout << "none const version show" << endl;
return 9;
}
};
int main(){
Eg const c1;
Eg c2;
c1.show();
c2.show();
return 0;
}
这里先卖个关子,int show(void) const 修饰的是 this指针!!!
调用者会根据对象的常属性匹配带有常属性的成员函数!!!
2. 重载解析过程
示例中的两个fool函数,因为类型不一致,可以形成重载关系;
但是编译过程中,编译器会发现两个重载版本和调用都完全匹配,所以报编译错误—通过这个例子我们可以看到编译器重载解析(选择合适的被调函数)这一过程
#include <iostream>
#include <string>
using namespace std;
void fool(int )
{
cout << "fool(int)" << endl;
}
void fool(int&)
{
cout << "fool(int&)" << endl;
}
int main(void) {
int a = 100;
/*重载解析错误,注释掉了*/
//fool(a);
int& i = a;
/*注释原因 同上,目前的代码是可以编译通过的*/
//fool(i);
return 0;
}