C++函数重载遇到了函数默认参数情况

一、C++中的函数重载

什么是函数重载?

我的理解是:

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

(2)函数名和不同参数搭配时函数会有不同的含义;

举例说明:

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int func(int x)
 5 {
 6     return x;
 7 }
 8 
 9 int func(int a, int b)
10 {
11     return a+b;
12 }
13 
14 int func(const char* s)
15 {
16     return strlen(s);
17 }
18 
19 int main(int argc,char* argv[])
20 {
21     printf("func(3)            = %d
",func(3));
22     printf("func(5,6)          = %d
",func(5,6));
23     printf("func("file cpp") = %d
",func("file cpp"));
24     
25     return 0;
26 }

运行结果:

 C++函数重载遇到了函数默认参数情况

 分析:

函数的重载在使用时,会根据传入的参数去选择执行对应的函数

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

(1)参数个数不同
(2)参数类型不同
(3)参数顺序不同
 
二、C++中的函数默认参数
举例说明
 1 #include <stdio.h>
 2 
 3 int func(int a, int b = 0)
 4 {
 5     return (a+b);
 6 }
 7 
 8 int main(int argc,char* argv[])
 9 {
10     printf("func(3)  = %d
",func(3));
11     printf("func(3,2)= %d
",func(3,2));
12 
13     return 0;
14 }

运行结果:

C++函数重载遇到了函数默认参数情况

 
二、当函数重载与默认参数同时出现时
在刚刚开始学习的时候,分开学习函数重载和默认参数,两种情况都理解了。但是,突然想到如果这两个同时出现会会出现一个什么样的结果呢?
实例代码:
 1 #include <stdio.h>
 2 
 3 int func(int a)
 4 {
 5     return (a);
 6 }
 7 
 8 int func(int a, int b = 0)
 9 {
10     return (a+b);
11 }
12 
13 int main(int argc,char* argv[])
14 {
15     printf("func(3)  = %d
",func(3));
16     printf("func(3,2)= %d
",func(3,2));
17     printf("test for temp.cpp
");
18     return 0;
19 }

写完了后,就在想代码执行后,到底会调用哪一个函数呢?

结果:

编译出错,错误信息:error: call of overloaded ‘func(int)’ is ambiguous printf("func(3)  = %d ",func(3));
 
分析:
在C++的编译器中,如果出现了函数重载和函数带有默认参数时,编译是会出错的。
 
总结:
由于C++的语言特性,与C相比多了很多的特性,但是在这些的特性中又会存在一个相互冲突的部分,函数重载与函数默认参数就是其中一个。