函数默认参数
在C++中,函数的形参列表中的形参是可以有默认值的。
语法: 返回值类型 函数名 (参数= 默认值){}
1 #include <iostream> 2 using namespace std; 3 void n(int a, int b, int c);//函数的声明与函数体之间只允许有一个设置默认值,即使默认值一样也不行 4 void n(int a, int b = 10, int c = 30)//如果某个位置有默认值那么自此往后,从左至右所有位置都必须设置默认值 5 { 6 cout << a + b + c << endl; 7 } 8 /* 9 以下是错误演示 10 void n(int a, int b = 10, int c = 30) 11 { 12 cout << a + b + c << endl; 13 } 14 void n(int a, int b, int c) 如果上面的函数设置了默认值,那么就只能有一个相同的函数 15 { 16 cout << a + b + c << endl; 17 } 18 */ 19 /* 20 以下是错误演示 21 void n(int a, int b = 10, int c = 30) 22 { 23 cout << a + b + c << endl; 24 } 25 void n(int a, int b = 10, int c = 30)//如果某个位置有默认值那么自此往后,从左至右所有位置都必须设置默认值 26 { 27 cout << a + b + c << endl; 28 } 29 当函数体设置了默认值时相同的函数不能设置默认值,即使默认值一样也不行 30 */ 31 int main() 32 { 33 cout << " a = 20 ,b为默认参数 , c为默认参数时 \ta + b + c ="; 34 n(20); 35 cout << " a = 30 ,b =20 , c = 60时 \ta + b + c ="; 36 n(30,20,60); 37 return 0; 38 }

函数占位参数
C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置
语法: 返回值类型 函数名 (数据类型){}
在现阶段函数的占位参数存在意义不大,但是后面的课程中会用到该技术
1 #include <iostream> 2 using namespace std; 3 void fuc(int a, int) 4 { 5 cout << "this is fuc " << endl; 6 } 7 int fuc1(int a,int = 10) 8 { 9 cout << "this is fuc1" << endl; 10 return a; 11 } 12 int main() 13 { 14 fuc(10,10);//调用然后释放 ,调用不一定要加cout,这只是代表输出 15 fuc1(45);//结果放在栈上面,运行一遍后会自动释放数值 16 //cout << fuc1 是不对的原因如上,值已经被自动释放了,会输出乱码 17 cout << fuc1(45) ;// 18 return 0; 19 }

函数重载
3.3.1 函数重载概述
**作用:**函数名可以相同,提高复用性
函数重载满足条件:
- 同一个作用域下
- 函数名称相同
- 函数参数类型不同 或者 个数不同 或者 顺序不同
注意: 函数的返回值不可以作为函数重载的条件

//函数返回值(比如int void的区别)不可以作为函数重载条件
//int func(double a, int b)
//{
// cout << "func (double a ,int b)的调用!" << endl;
//}
1 #include <iostream> 2 using namespace std; 3 void chongzai() 4 { 5 cout << "chongzai 函数的调用" << endl; 6 } 7 void chongzai(int a) 8 { 9 cout << "chongzai(int a) 函数的调用" << endl; 10 } 11 void chongzai(double a) 12 { 13 cout << "chongzai(double a) 函数的调用" << endl; 14 } 15 void chongzai(int a,double b) 16 { 17 cout << "chongzai(int a,double b) 函数的调用" << endl; 18 } 19 void chongzai(double a,int b) 20 { 21 cout << "chongzai(double a,int b) 函数的调用" << endl; 22 } 23 int main() 24 { 25 chongzai(); 26 chongzai(10); 27 chongzai(3.14); 28 chongzai(10,3.14); 29 chongzai(3.14,10); 30 return 0; 31 }

函数重载注意事项
- 引用作为重载条件
- 函数重载碰到函数默认参数
1 #include <iostream> 2 using namespace std; 3 void chongzai(int& a) 4 { 5 cout << "chongzai(int a) 函数的调用" << endl; 6 } 7 void chongzai(const int &a) 8 { 9 cout << "chongzai(const int& a) 函数的调用" << endl; 10 } 11 void chongzai2(int a, int b = 10) 12 { 13 cout << "chongzai2(int a, int b = 10) 调用" << endl; 14 } 15 16 void chongzai2(int a) 17 { 18 cout << "chongzai2(int a) 调用" << endl; 19 } 20 int main() 21 { 22 int a = 20; 23 chongzai(a); 24 chongzai(10);
25 chongzai2(10, 20); 26 //chongzai2(10)不能是因为 chongzai2(int a, int b = 10) & chongzai2(int a)都可以调用,系统不知道调用哪个会出现歧义 27 return 0; 28 }

/* 为什么chongzai(a)是调用void chongzai(int& a),而chongzai(10)是调用void chongzai(const int &a),且相同能分清需要调用的函数主体
因为chongzai(10)时,如果调用chongzai(a)就会变成&a = 10;,而10的内存空间是系统保留的内存空间,不能被非系统调用,所有会出错,
而const int &a是系统会自动创建一个临时变量,同时把10赋值给它,然后指针指向这个临时变量
系统会自动区分哪个是需要创建的哪个是不需要创建的,需要时调用void chongzai(const int&a),不需要时调用另外一个 */
m 函数重载了,所有不会有预设默认参数后,写多个同名函数时出现的主体不明的状况

浙公网安备 33010602011771号