1、函数默认参数
在C++语法中,函数的形参列表中的形参是可以有默认值的
语法:返回值类型 函数名 (参数 = 默认值){ }
如:void func(int a = 10){ }
注意1:
如果某个位置参数有默认值,那么这个位置往后,从左向右,必须都要有默认值!
如:void func(int a, int b = 10, int c) {}
这是错误的,如果b有默认值,则c也一定要有默认值(因为c在b右边)
注意2:
如果函数声明有默认值,那么函数实现的时候就不能有默认值
void func(int a = 10); //这是个函数声明
void func(int a = 10) { } //这是个函数实现
以上是错误的,函数声明和函数实现不能同时有默认值!
2、函数占位参数
C++函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置
语法:返回值类型 函数名(数据类型){}
tips:现阶段函数的占位参数存在意义不大,但是后面的课程中会用到该技术。
3、函数重载(Overloaded)
3.1函数重载概述
作用:函数名可以相同,提高重复性
函数的名字仅仅是让编译器知道它调用的是哪个函数,而函数重载可以在一定程度上减轻程序员起名字、记名字的负担。
定义:同一作用域的几个函数名字相同但形参列表不同
函数重载满足条件:
1、同一作用域下
2、函数名称相同
3、函数 参数类型不同 或者 个数不同 或者 顺序不同
注意:函数的返回值不可以作为函数重载的条件
(不允许两个函数除了返回值类型以外的其他所有的要素都相同!)
如:
void func(int a = 10);
int func(int a = 10);
这俩函数不是函数重载!第二个函数声明错误
3.2调用重载函数
函数匹配(function macting):是指一个过程,在这个过程中我们把函数调用与一组重载函数中的某一个函数匹配起来。
函数匹配也叫重载确定(overload resolution)。
编译器做的事:
编译器首先将调用的实参与重载集合中每一个函数的形参进行比较,然后根据比较的结果决定调用哪个函数。
调用重载函数时有三种可能的结果:
1、编译器找到一个与实参最佳匹配(best match)的函数,并生成调用该函数的的代码。
2、找不到任何一个函数与调用的实参匹配,此时编译器发出无匹配(no match)的错误信息。
3、有不止一个函数可以匹配,但是每一个都不是最明显的最佳选择。此时也将发生错误。称为二义性调用(ambiguous call)。
3.3函数重载注意事项
1、main函数不能重载
2、引用可以作为函数重载条件
3、函数重载碰到函数默认参数
容易出现二义性,编译器报错,应尽量避免出现这种情况出现
如:
void func1(int a);
void func2(int a, int b = 10);
但是在调用的时候却可以
func1(10);
func2(10);
会出现二义性!