函数重载
关于函数重载,大致顺序是,编译器先通过函数声明找到名字一样的函数,这些被找到的函数叫做候选函数,其次通过形式参数的数量,类型匹配来找到可以调用的函数,这些被找到的函数叫做可行函数。然后在通过类型匹配,找到最佳匹配,从而调用这个最佳匹配的函数。这里需要说的是,如果类型不匹配,则必须是可以将实参类型通过隐式转换到形参类型的,这个转换有一定的优先级别。具体可以参考<<c++ primer>>第四版7.7.4 小节。其中一点需要特别注意,就是const 修饰形参时,仅在形参类型为指针或引用时,可以有效作为重载类型。举例如下:
1 // ConsoleApplication7.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 #include <string> 7 using namespace std; 8 9 int calc(int&, int&) 10 { 11 return 1; 12 } 13 14 int calc(const int&, const int&) 15 { 16 return 1; 17 } 18 19 int calc(char*,char*) 20 { 21 return 1; 22 } 23 24 int calc(const char* , const char* ) 25 { 26 return 2; 27 } 28 29 int main() 30 { 31 int i = 0, j = 0; 32 cout << calc(i, j) << endl; 33 char arry1[] = {'a','b','c','d'}; 34 char arry2[] = { 'a','b','c','d','e' }; 35 cout << calc(arry1, arry2) << endl; 36 const char arry3[] = { 'a','b','c','d' }; 37 const char arry4[] = { 'a','b','c','d','e' }; 38 cout << calc(arry3, arry4) << endl; 39 return 0; 40 }
第32行输出的结果是1,说明调用了第九行定义的calc函数。下面定义了字符数组arry1,arry2,arry3,arry4,分别调用calc函数,分别返回1和2。说明这些const 修饰的形参的确实现了函数重载。如果将第九行calc函数的定义去掉引用,那么执行就会报错。