函数重载

关于函数重载,大致顺序是,编译器先通过函数声明找到名字一样的函数,这些被找到的函数叫做候选函数,其次通过形式参数的数量,类型匹配来找到可以调用的函数,这些被找到的函数叫做可行函数。然后在通过类型匹配,找到最佳匹配,从而调用这个最佳匹配的函数。这里需要说的是,如果类型不匹配,则必须是可以将实参类型通过隐式转换到形参类型的,这个转换有一定的优先级别。具体可以参考<<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函数的定义去掉引用,那么执行就会报错。

 

posted on 2017-03-05 13:09  ^~~^  阅读(341)  评论(0编辑  收藏  举报

导航