3.4函数重载和默认参数

区别一是参数类型不同,二是参数个数不同

仅有函数返回值不同也是区分不了重载函数的

 1 #include <iostream>
 2 using namespace std;
 3 
 4 void go(int i, double db)//参数的个数,参数的类型不同,顺序不同,与返回值无关
 5 {
 6 
 7 }
 8 
 9 void go(double db, int i)
10 {
11 
12 }
13 
14 void main()
15 {
16 
17     system("pause");
18 }

//定义函数指针并初始化

 1 #include <iostream>
 2 using namespace std;
 3 
 4 void go(int a)//参数的个数,参数的类型不同,顺序不同,与返回值无关
 5 {
 6     std::cout << a;
 7 }
 8 
 9 void go(double a)
10 {
11     std::cout << a;
12 }
13 
14 void go(double a, int b)
15 {
16     std::cout << a << b;
17 }
18 
19 void go(int a, double b)
20 {
21     std::cout << a << b;
22 }
23 
24 void main()
25 {
26     void(*pgo1)(int a) = go;//定义函数指针并初始化
27 
28     void(*pgo2)(double db) = go;
29 
30     void(*pgo3)(double a, int b) = go;
31 
32     void(*pgo4)(int a, double b) = go;
33 
34     printf("%p
", pgo1);
35 
36     printf("%p
", pgo2);
37 
38     printf("%p
", pgo3);
39 
40     printf("%p
", pgo4);
41 
42     system("pause");
43 }

//默认参数可以多于1个,但必须放在参数序列的后部

//默认参数必须放在右边

//默认参数中间不允许出现不默认的

 1 #include <iostream>
 2 using namespace std;
 3 
 4 //默认参数必须放在右边
 5 //默认参数中间不允许出现不默认的
 6 void print(int c, int a = 1, int b = 3)//默认参数可以多于1个,但必须放在参数序列的后部
 7 {
 8     std::cout << a << " " << b << " " << c << std::endl;
 9 }
10 
11 void main()
12 {
13     print(1);
14 
15     system("pause");
16 }

//error C2668: “print”: 对重载函数的调用不明确

 1 #include <iostream>
 2 using namespace std;
 3 
 4 void print(int c, int a = 1, int b = 3)
 5 {
 6     std::cout << a << " " << b << " " << c << std::endl;
 7 }
 8 
 9 //error C2668: “print”: 对重载函数的调用不明确
10 
11 void print(int c)
12 {
13 
14 }
15 
16 void main()
17 {
18     print(1);
19 
20     system("pause");
21 }

解决办法:使用命名空间,或者函数指针

函数指针没有默认参数

//函数指针没有默认参数,必须全部输入数据

//函数重载与函数默认参数冲突,需要输入的参数类型不一样,个数不一样,顺序不一样,不会发生错误,否则一定报错

 1 #include <iostream>
 2 using namespace std;
 3 
 4 void print(int c, int a = 1, int b = 3)
 5 {
 6     std::cout << a << " " << b << " " << c << std::endl;
 7 }
 8 
 9 //error C2668: “print”: 对重载函数的调用不明确
10 
11 void print(int c)
12 {
13 
14 }
15 
16 //函数指针没有默认参数,必须全部输入数据
17 //函数重载与函数默认参数冲突,需要输入的参数类型不一样,个数不一样,顺序不一样,不会发生错误,否则一定报错
18 
19 void main()
20 {
21     void(*pt1)(int c, int a, int b) = print;//函数指针
22 
23     pt1(100, 1, 2);//函数指针调用,没有默认参数
24 
25     system("pause");
26 }
原文地址:https://www.cnblogs.com/denggelin/p/5644678.html