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

1. 自然语言中的上下文

  • 你知道下面词汇中“洗”字的含义吗?

 

 

结论:

  • 能和“洗”字搭配的词汇有很多

  • “洗”字和不同的词汇搭配有不同的含义

 

2. 重载的概念

  • 重载(Overload

    - 同一个标识符在不同的上下文有不同的含义

    - 如:

    (1)“洗”和不同的词汇搭配后有不同的含义

              洗衣服、洗脸、洗马桶、洗脑。。。

    (2)  “play”和不同的词汇搭配后有不同的含义

        play chess、play piano、play basketball、...

 

思考。。。

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

 

3. C++中的函数重载

  • 函数重载(Function Overload

    - 用同一个函数名定义不同的函数

    - 当函数名和不同的参数搭配时函数的含义不同

int func(int x)
{
    return x;
}

int func(int a, int b)
{
    return a + b;      
}

int func(const char* s)
{
    return strlen(s);
}
  • 函数重载至少满足下面的一个条件

    - 参数个数不同

    - 参数类型不同

    - 参数顺序不同

int func(int a, const char* s)
{
    return a;    
}

int func(const char* s, int a)
{
    return strlen(s);
}

上面的两个函数可以构成重载函数吗?

 

  • 函数默认参数遇上函数重载会发生什么?
int func(int a, int b, int c = 0)
{
    return a * b * c;
}

int func(int a, int b)
{
    return a + b;
}

int main()
{
    int c = func(1, 2);    // which one?

    return 0;  
}

 

  • 编译器调用函数重载的准则

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

    - 尝试寻找可行的候选函数

      (1)精确匹配实参

      (2)通过默认参数能够匹配实参

      (3)通过默认类型转换匹配实参

    - 匹配失败

      (1)最终寻找到的候选函数不唯一,则出现二义性,匹配失败

      (2)无法匹配所有候选者,函数未定义,编译失败

 

  • 函数重载的注意事项

    - 重载函数在本质上是相互独立的不同函数

    - 重载函数的函数类型不同

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

    - 函数重载是由函数名参数列表决定的!

#include <stdio.h>

int func(int a, int b)
{
    return a + b;
}

int func(int a, int b, int c)
{
    return a * b * c;
}

int main()
{
    printf("%p\n", (int(*)(int, int))func);
    printf("%p\n", (int(*)(int, int, int))func);
    
    return 0;
}

 

4. 小结

  • 函数重载是C++中引入的概念

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

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

  • 函数重载的本质为相互独立的不同函数

  • C++中通过函数名函数参数确定函数调用

本文出处:狄泰软件学院

 

posted @ 2020-03-22 13:41  WisdomMan  阅读(0)  评论(0)    收藏  举报