1. 函数的重载(Overload)的概念
(1)用同一个函数名定义不同的函数
(2)当函数名和不同的参数搭配时,函数的含义不同。
【编程实验】函数重载初探
#include <stdio.h> #include <string.h> int func(int x) { return x; } int func(int a, int b) { return a + b; } int func(const char* s) { return strlen(s); } int main() { printf("%d\n", func(3)); //int (int) printf("%d\n", func(4,5)); //int (int,int) printf("%d\n", func("Hello World!")); //int (const char* s) return 0; }
2. 函数重载
(1)重载的条件:必须至少满足下面的一个条件
①参数个数不同
②参数类型不同
③参数顺序不同
(2)函数重载的注意事项
①重载函数在本质上是相互独立的不同函数。
②重载函数的函数类型不同
③函数的返回值不能作为函数重载的依据
④函数重载是由函数名和参数列表共同决定的。
【编程实验】函数重载的本质
#include <stdio.h> int add(int a, int b) //函数类型:int(int,int) { return a + b; } int add(int a, int b, int c) //函数类型:int(int, int, int) { return a + b + c; } int main() { //printf("%p\n", add);//因为函数的重载,在编译的结果中找不到这样的函数名 //以下两个printf显示出来,重载函数的本质是相互独立的两个函数,其函数地址 //是不同的。 printf("%p\n",(int (*)(int, int))add); //在add前面加上类型,编译器就会 //就根据重载函数的命名规则找到 //被编译后的真正的函数名 printf("%p\n",(int (*)(int, int,int))add);//在add前面加上类型,编译器就会 //就根据重载函数的命名规则找到 //被编译后的真正的函数名 return 0; }
3. 函数重载与函数的默认参数
(1)编译器调用重载函数的准则
①将所有同名函数作为候选者
②尝试寻找可行的候选函数(注意,下面3种匹配任一种后,会继续匹配下一种,所以可能出现多个匹配的结果!)
A.精确匹配实参;B通过默认参数能够匹配实参;C通过默认类型转换匹配实参
③匹配失败
A.最终寻找到的候选函数不唯一,则出现二义性,编译失败。
B.无法匹配所有候选者,函数未定义,编译失败
【编程实验】函数默认参数 VS 函数重载
#include <stdio.h> int func(int a, int b, int c = 0) { return a * b * c; } int func(int a, int b) { return a + b; } int main() { //根据匹配原则:通过函数名找到两个候选函数 //并尝试先通过精确匹配会找到func(int,int) //但这时并不会停止匹配,而是会尝试用默认参数去匹配 //所以会找到另一个func,即func(int,int,int = 0),因此 //出现了二义性,编译器直接报错。 int c = func(1, 2); return 0; }
4. 小结
(1)函数重载是C++中引入的概念
(2)函数重载用于模拟自然语言中的词汇搭配
(3)函数重载使得C++具有更丰富的语义表达能力
(4)函数重载的本质为相互独立的不同函数
(5)C++中通过函数名和函数参数确定函数调用