第8课 函数重载分析(上)

1. 重载的概念

(1)同一个标识符不同的上下文有不同的意义

      

(2) 重载自然语言中是随处可见的,那么程序设计中是否也有重载呢?

2. 函数的重载的概念(Function Overload)

(1)用同一个函数名定义不同的函数

(2)当函数名不同的参数搭配时,函数的含义不同

      

    

【编程实验】函数重载初探  8-1.cpp

#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
", func(3));              //int (int)

    printf("%d
", func(4,5));            //int (int,int)

    printf("%d
", func("Hello World!")); //int (const char* s)

 

    return 0;  

}

运行结果:

  

3. 函数重载的条件和注意事项

(1函数重载的条件:必须至少满足下面的一个条件

  ①参数个数不同

  ②参数类型不同

  ③参数顺序不同

(2)函数重载的注意事项

①    重载函数本质上相互独立的不同函数

②    重载函数函数类型不同

③    函数的返回值不能作为函数重载的依据

④    函数重载是由函数名参数列表共同决定的

 

【编程实验】函数重载的本质  8-3.cpp

#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
", add);//因为函数的重载,在编译的结果中找不到这样的函数名

 

    //以下两个printf显示出来,重载函数的本质是相互独立的两个函数,其函数地址

    //是不同的。

 

    printf("%p
",(int (*)(int, int))add);    //在add前面加上类型,编译器就会

                                              //就根据重载函数的命名规则找到

                                              //被编译后的真正的函数名

 

    printf("%p
",(int (*)(int, int,int))add);//在add前面加上类型,编译器就会

                                              //就根据重载函数的命名规则找到

                                              //被编译后的真正的函数名

    return 0;  

}

运行结果:

  

4. 函数重载函数默认参数

(1)编译器调用重载函数准则

  ①将所有同名函数作为候选者

  ②尝试寻找可行的候选函数(注意,下面3种匹配任一种后,会继续匹配下一种,所以可能出现多个匹配的结果!)

    • A.精确匹配实参;

    • B通过默认参数能够匹配实参;

    • C通过默认类型转换匹配实参

  ③匹配失败

    A.最终寻找到的候选函数不唯一,则出现二义性,编译失败

    B.无法匹配所有候选者,函数未定义,编译失败

【编程实验】函数重载  VS 函数默认参数  8-2.cpp

#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;  

}

编译报错:

  

5. 小结

(1)函数重载C++中引入的概念

(2)函数重载用于模拟自然语言中的词汇搭配

(3)函数重载使得C++具有更丰富的语义表达能力

(4)函数重载本质为相互独立的不同函数

(5)C++中通过函数名函数参数确定函数调用

原文地址:https://www.cnblogs.com/hoiday/p/10089068.html