浅墨浓香

想要天亮进城,就得天黑赶路。

导航

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

Posted on 2016-04-09 20:19  浅墨浓香  阅读(396)  评论(0编辑  收藏  举报

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++中通过函数名函数参数确定函数调用