1.建立函数的时候,函数的小括号里放的就是形参列表 --- 然后在c++中,允许给予形参列表中的形参默认值(即初始值),如下:
1.如果形参有默认值的话,那么可以不用传实参给这个形参
2.如果形参有默认值的情况下依然传实参给这个形参的话,那么会出现的结果就是传过去的实参取代默认值赋值给形参
关于形参默认值的注意事项:
上面那个案列就是错误示范
上面这个案例是错误示范
1.按照建立函数的方式写了开头,然后再在开头的最后面加上分号 ;---> 这就是一个函数的声明
2.而如果正常创建一个函数,则这个就是函数的实现
3.函数的实现和函数的声明中都有形参,且形参数量相同,但是!!当在赋予形参默认值的时候,我们只能选择函数的实现或函数的声明中的一个来赋予,而不能两个同时赋予
4.函数的声明相当于在给函数出现顺序排队时,在排队的队伍中放了一个占位符,并且可以通过这个占位符找到函数的实现
1.直接写个数据类型而不创建形参变量的话,这个数据类型就相当于是一个占位参数
1.有了占位参数之后,我们在调用函数的时候必须传一个和作为占位参数的数据类型相同类型的数据才行,如占位阐述是 int ,那我们在调用函数时就要传一个int(整型)型数据
2.占位参数也可以有默认参数,有了默认参数的话我们也可以在调用函数的时候不传数据去占空
在c++中函数有一个特性叫做函数重载,这个特性是指:c++中的各个函数在满足一定条件的时候,它们的函数名可以相同
1.函数的参数指的是形参列表里的内容
2.函数在同一个作用域下 ---> 目前我们写的函数都在同一个全局作用域下(或者说是在同一个源文件中的意思?)
这个就是没有符合函数重载条件的时候出现的函数名相同,这种情况是错误的,因为我们的计算机在调用func函数的时候无法选择调用哪一个fun函数,会导致程序出错
再次重申函数重载的满足条件:
- 1.函数必须在同一个作用域下(函数内部称为局部作用域,所有函数之外称为全局作用域,我们现在写的函数都是写在全局作用域处)
- 2.函数名称相同
- 3.函数的参数类型不同,或者个数不同,或者顺序不同
对上面这个例子进行修改:
此时这两个func函数就满足函数重载的条件,当我们在main 函数中写:
func() --- 由于没有传参,根据这个特点计算机会选择调用没有参数的那个函数
func(10) --- 调用有参数
这样的话,哪怕函数名相同,计算机也可以根据形参列表中的不同来区分函数 要注意的是函数的返回值不可以作为重载的判断条件!!!
1.引用也分为两种类型的引用:
一.可读可写的引用(即无const型) --- 如 int& a = b;
二.只可读不可写的引用(即const型) --- 如 cosnt int& a = 10 / const int& a = b ;
对于const 型来说会先发生代码转换 ---- int temp = 10 ; cosnt int& a = temp ; 或者是 int temp = b ; const int& a = temp ;
如果我们传的是一个可读可写的变量的话,一旦传给了第二种类型就会转变为一个只可读不可写的常量(因为cosnt修饰),而我们把数据传给第一种类型的话,依然可以保持是一个可读可写的变量,所以计算机会优先选择第一种类型
如果我们传的是一个只可读不可写的常量(如10,20,30等等)的话,那么选择第一种类型的形参的话就是非法操作,因为 Int& a = 10; 这种普通引用遇到常量的话会导致别名找不到对应的内存空间,使得引用失败。只有选择第二种类型的形参,通过代码转化的方式使得引用成立
有了这个区别的话,引用也可以作为函数重载的判断条件
这种情况在语法上是成立的,但是当我们实际调用函数的时候还是可能会出错的
这种可能出错的情况就是我们只传一个参 a 的时候,计算机如果选择第一个函数的话,我们传参a进去,然后b有默认参数(可传参,也可以不传参),函数的参数都起了,函数可被调用
如果选择第二个函数的话,函数的参数也起了,函数可被调用
两个函数都可被调用的时候计算机陷入二义性难题,进而出错
为了避免这种错误出现,我们写函数重载的时候就尽量不要给函数形参写默认参数