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

1、重载的概念 

        重载(Overload) 

            -同—个标识符在不同的上下文有不同的意义 

            -如: 

                    "洗"和不同的词汇搭配后有不同的含义 

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

                    "play"和不同的单词搭配后有不同的含义 

                            play chess, play piano, play basketball, ...

2、思考

            重载在自然语言中是随处可见的。 

            那么程序设计中是否也有重载呢?


3、C++中的函数重载 

            函数重载(Function Overload) 

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

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

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

                    -参数个数不同                 

                    -参数类型不同  

                    -参数顺序不同 


4、编程实验

#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(int argc, char *argv[])  
{  
    printf("%d\n", func(3));  
    printf("%d\n", func(4, 5));  
    printf("%d\n", func("D.T.Software"));  
      
    return 0;  
}  

                        


                    当函数默认参数遇上函数重载会发生什么?


6、编程实验

函数默认参数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(int argc, char *argv[])  
{  
    int c = func(1, 2);  
      
    return 0;  
}  

            

                                若不调用,只定义会发现编译通过

                    C++引入了太多特性,然而有些特性之间会产生冲突

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

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

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

                            • 精确匹配实参 

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

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

                 -匹配失败 

                              • 最终寻找到的候选函数不唯—,则出现二义性,编译失败。 

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


                                    当8-2.cpp中函数调用改为func(1)时:

            

            函数重载的注意事项 

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

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

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


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


7、编程实验

函数重载的本质     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\n", (int(*)(int, int))add);  
    printf("%p\n", (int(*)(int, int, int))add);  
  
    return 0;  
}  

                        

            

                                    即对C++来说重载函数是不同的函数


8、小结

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

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

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

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

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


猜你喜欢

转载自blog.csdn.net/qq_39654127/article/details/79672598