黑马程序员匠心之作|C++教程从0到1入门编程
关于P95~P98-练习-函数的提高
1、函数默认参数2、函数的占位参数3、函数重载-基本语法4、函数重载-注意事项1、函数默认参数
在c++中,函数的形参列表中的形参是可以有默认值的。
语法:返回值类型 函数名 (参数=默认值){}
#include<iostream>using namespace std;//函数默认参数//如果我自己传如数据,就自己的数据,如果没有就用默认值//语法:返回值类型 函数名(形参=默认值){}int func1(int a, int b=10 , int c=20 ){return a + b + c;}//注意事项//1、如果某个位置已经有了默认参数,那么从这个位置往后,从左到右都必须有默认值//int func2(int a, int b = 10, int c)//报错,默认实参不在形参列表的结尾//{//return a + b + c;//}//2、如果函数的声明有默认参数,函数实现就不能有默认参数//声明和实现只能有一个有默认参数int func2(int a = 10, int b = 20);//int func2(int a = 10, int b = 20)//报错,重定义默认参数;如果ab与上面不同,二义性//{//return a + b;//}int main(){cout << func1(10, 20, 30) << endl;//cout << func2() << endl;system("pause");return 0;}
注意:
1、如果某个位置已经有了默认参数,那么从这个位置往后,从左到右都必须有默认值
2、如果函数的声明有默认参数,函数实现就不能有默认参数,即声明和实现只能有一个有默认参数
2、函数的占位参数
C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置
语法:返回值类型 函数名(数据类型){}
在现阶段函数的占位参数存在意义不大,但是后面的课程中会用到该技术
#include<iostream>using namespace std;//函数占位参数,占位参数也可以有默认值//语法:返回值类型 函数名(数据类型){}void func1(int a, int ){cout << "this is func1" << endl;}int main(){func1(10,10);//占位参数必须填补system("pause");return 0;}
3、函数重载-基本语法
作用:函数名可以相同,提高重复性
函数重载满足条件:
同一个作用域下函数名称相同函数参数类型不同或者个数不同或者顺序不同
注意:函数的返回值不可以做为函数重载的条件
#include<iostream>using namespace std;//函数重载//可以让函数名相同,提高复用性//函数重载满足条件://1、同一个作用域下//2、函数名称相同//3、函数参数类型不同,或者个数不同,或者顺序不同void func()//第一个{cout << "func的调用" << endl;}void func(int a)//第二个{cout << "func(int a)的调用" << endl;}void func(double a)//第三个{cout << "func(double a)的调用" << endl;}void func(int a,double b)//第四个{cout << "func(int a,double b)的调用" << endl;}void func(double a,int b)//第五个{cout << "func(double a,int b)的调用" << endl;}int main(){func(); //调用第一个func(10);//调用第二个func(3.14);//调用第三个func(10,3.14);//调用第四个func(3.14,10);//调用第五个system("pause");return 0;}
注意:函数的返回值不可以作为函数重载的条件,调用时二义性
void func(double a,int b)//第五个{cout << "func(double a,int b)的调用" << endl;}int func(double a, int b)//第六个,错误的,无法返回仅按返回值类型区分的函数{cout << "func(double a,int b)的调用" << endl;}
4、函数重载-注意事项
注意:
引用作为重载条件函数重载碰到函数默认参数
#include<iostream>using namespace std;//函数重载的注意事项//1、引用作为重载条件void func(int&a)//第一个{cout << "func(int&a)调用" << endl;}void func(const int&a)//第二个{cout << "func(const int&a)调用" << endl;}//2、函数重载碰到函数默认参数void func2(int a,int b=10)//第一个{cout << "func(int a,int b)调用" << endl;}void func2(int a)//第二个{cout << "func(int a=10)调用" << endl;}int main(){int a = 10;func(a);//变量a,可读可写,调用第一个func(10);//调用第二个,const int&a=10,合法。假如第一个的话,相当于int &a=10;没有合法空间//func2(10);//当函数重载碰到默认参数,出现二义性,报错,尽量避免这种情况system("pause");return 0;}
注意:
1、引用作为重载条件,加const与不加const。func(a);
变量a,可读可写,调用第一个;func(10);
调用第二个,const int&a=10
,合法。假如第一个的话,相当于int &a=10;
没有合法空间
2、函数重载碰到函数默认参数void func2(int a,int b=10)
与void func2(int a)
在main中调用func2(10);
时,碰到默认参数,出现二义性,报错,尽量避免这种情况