论坛首页 编程语言技术论坛

Default parameter rules

浏览 1485 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-09-30  
C++

一般情况,默认参数值在函数声明时声明的。因为在实用的程序中,函数声明总是与函数定义分离的,而在又有声明又有定义时,默认参数值自然只能置身于声明中。

以下例子是一般情况:

 

void point(int = 3, int = 4);    //声明    默认参数值,同时注意可以形参省略

void point(int x, int y) {         //定义    不允许再给出默认值
    cout<<x<<endl;
    cout<<y<<endl;
}

 

 

函数参数默认值只能从后往前设置,因为在进行实参与形参的匹配时是按从前到后的解析,如果默认参数是从后往前设置,那么有可能后面的参数没有设置默认值,在传实参的时候少传了没有默认值的实参,导致栈空间的变量没有被初始化,进而发生错误,例如:

 

void func(int a = 1, int b, int c, int d = 3);     //错误的声明

func(2,3);//传入参数   a = 2? b = 2? c = 3?-----确定不了

相对的,默认实参只能从后往前逐个替换(即当实参从前往后替换完后),例如:

void func(int a, int b = 2, int c = 3, int d = 4);      //正确声明
func(10, 15, 20, 30);             //全部替换
func();                                   //错,a没有默认参数
func(12, 12);                         //替换了a和b
func(2, 15, ,20);                    //错,当从后替换默认参数时发现最后一个已经有了实参,c不能被替换,因为还有无默认参数的没被实参替换完的情况

 默认参数值不能重复声明(这个很好理解了),例如:

void func(int a = 1);

void func(int a = 2);   //错
 
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics