1 函数重载的定义函数重载使用同一个函数名定义不同的函数。从本质上来看就是互相独立的不同函数每一个函数类型不同。因此函数重载是由函数名和参数列表决定的。注意函数返回值不能作为函数重载的重要依据2 构成函数重载的条件当满足以下三个条件之一时便可以构成函数重载函数参数个数不同123456789101112131415161718// 函数类型void(int)voidDemo(intx){printf(x %d\r\n, x);}// 函数类型void(int, int)voidDemo(intx,inty){printf(x %d\r\n, x);printf(y %d\r\n, y);}// 函数类型void(int, int, int)voidDemo(intx,inty,intz){printf(x %d\r\n, x);printf(y %d\r\n, y);printf(z %d\r\n, z);}函数参数类型不同12345678voidDemo(intx){printf(x %d\r\n, x);}voidDemo(charx){printf(x %c\r\n, x);}函数参数顺序不同12345678910voidDemo(charc,intx){printf(x %d\r\n, x);printf(c %c\r\n, c);}voidDemo(intx,charc){printf(x %d\r\n, x);printf(c %c\r\n, c);}但是如果函数的参数类型均相同仅仅顺序不同同样会出错如下所示的代码123456789101112voidDemo(intx,inty,intz){printf(x %d\r\n, x);printf(y %d\r\n, y);printf(z %d\r\n, z);}voidDemo(inty,intx,intz){printf(x %d\r\n, x);printf(y %d\r\n, y);printf(z %d\r\n, z);}3 编译器调用重载函数的准则编译器编译代码的流程将所有同名函数作为候选者尝试寻找可行的候选函数精确匹配实参通过默认参数匹配实参通过默认类型转换匹配实参匹配成功如果编译失败的话有如下两种情况找到的候选函数不唯一出现二义性失败无法匹配所有候选者函数未定义失败4 函数重载的注意事项4.1 避开重载带有指定默认值参数的函数在我们使用函数重载的过程要注意避开重载带有指定默认值参数的函数。否则在使用的过程中会出现二义性导致编译失败。如下代码所示的错误示例12345678910111213141516voidDemo(intx,inty){printf(x %d\r\n, x);printf(y %d\r\n, y);}voidDemo(intx,inty,intz 0){printf(x %d\r\n, x);printf(y %d\r\n, y);printf(z %d\r\n, z);}intmain(){Demo(1, 2);return0;}当对重载函数进行调用时Demo(1, 2)编译器是无法分辨我们到底是使用void Demo(int x, int y)函数还是使用void Demo(int x, int y, int z 0)函数因此无法编译通过。4.2 注意函数重载遇上函数指针重载函数的名称赋值给函数指针后当对函数指针进行调用时将根据下面的方式进行函数匹配首先根据重载规则挑选与函数指针参数列表一致的候选者然后根据候选者的函数类型与函数指针的函数类型进行匹配通过如下代码所示的示例进行解释12345678910111213141516171819202122232425typedefint(*PDemo)(inti);// Demo1intDemo(intx){returnx;}// Demo2intDemo(intx,inty){returnx * y;}// Demo3intDemo(constchar* c){returnstrlen(c);}intmain(){inti 0;PDemo pd Demo;// 一个参数因此不是Demo1就是Demo3// pd的函数类型是int(int)与Demo1相同因此就是Demo1i pd(1);return0;}如果将上述示例中函数指针的返回类型由int更改成double仍通过pd(1)进行调用的话该程序将不能被编译过因为没有与之匹配的重载函数。参数列表没有问题函数返回值类型有问题因为函数类型包含函数的返回值类型4.3 C编译器不能以 C 的方式编译重载函数由于 C 编译器将函数名和参数列表编译成目标名C 编译器将函数名编译成目标名这样 C 编译器编译后的重载函数的目标名一致于是便无法实现重载函数的功能。