函数默认参数和函数调用传参匹配原则

C++中允许为函数提供默认参数,又名缺省参数。
  • 使用默认参数时的注意事项:

① 有函数声明(原型)时,默认参数可以放在函数声明或者定义中,但只能放在二者之一。建议放在函数声明中。

double sqrt(double f = 1.0); //函数声明

double sqrt(double f)  //函数定义
{
  // ....  
} 

② 没有函数(原型)时,默认参数在函数定义时指定.

//没有 函数声明

double sqrt(double f = 1.0)  //函数定义

③ 在具有多个参数的函数中指定默认值时,默认参数都必须出现在不默认参数的右边,一旦某个参数开始指定默认值,它右边的所有参数都必须指定默认值.

int f (int i1, int i2 = 2, int i3 = 3);     // 正确
int g (int i1, int i2 = 2, int i3);         // 错误, i3未指定默认值
int h (int i1 = 1, int i2, int i3 = 3);     // 错误, i2未指定默认值

④ 在调用具有默认参数的函数时, 若某个实参默认,其右边的所有实参都应该默认。

//例如, 一个函数声明如下
int f(int i1 = 1, int i2 =2, int i3 = 3);


//调用函数 f()
f();             //正确, i1=1, i2=2, i3=3
f(3);            //正确, i1=3, i2=2, i3=3
f(2, 3);         //正确, i1=2, i2=3, i3=3
f(4, 5, 6);      //正确, i1=4, i2=5, i3=6
f(, 2, 3);       //错误, i1默认,其右边的i2和i3没有默认

注意的是:
带缺省值的参数必须放在参数列表的最后面。因为传参是从右向左的。
缺省参数不能同时在函数声明和定义中出现,只能二者留其一。
缺省值必须是常量或者全局变量。
C语言并不支持缺省。


函数传参顺序和匹配原则:

假设一个函数头是void show(int a,int b,int c)
1、因为传参时,是按形参列表从左向右赋值的(即先赋给a,再赋给b,最后赋给c)。故如果设默认值的话,应该从最右端开始,才能保证传进来的值能正确对应地赋给所想的参数,也不会覆盖掉预先设好的默认值

2、上例中,如果要定义默认参数,则首先应该定义c的默认参数值,只有在c的默认值定义好的情况下才能继续定义b为默认参数。满足从右向左顺序。例如,void show(int a,int b =1,int c=2)

3、如果不按顺序来,比如定义成了void show(int a,int b=1,int c),首先,vs2010会报错。不过,先假设比较早的版本不报错。
若想让b使用默认值,则在调用函数时无法成功
1)比如,写成show(2,3),这样写是错误的
2)比如,写成show(2,3),系统肯定会认为这是给a、b传的值。而c没被传值,又没有默认值,因此还是错的

总结:
设置函数默认参数(缺省实参)是从右往左;调用函数传入实参时,实参和函数的形参的匹配顺序是从左往右

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yhblog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值