Chinaunix首页 | 论坛 | 博客
  • 博客访问: 420567
  • 博文数量: 62
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 740
  • 用 户 组: 普通用户
  • 注册时间: 2015-05-10 21:59
个人简介

付出,终有回报!

文章分类

全部博文(62)

文章存档

2018年(6)

2017年(24)

2016年(6)

2015年(26)

分类: C/C++

2017-10-19 10:46:01

我们可以赋予函数参数默认值。所谓默认值就是在调用时,可以不写某些参数的值,编译器会自动把默认值传递给调用语句中。默认值可以在声明或定义中设置;在声明或定义时都设置,会出现重定义默认参数的错误。
在使用带有默认参数的函数时有几点要注意:
(1)如果函数的定义在函数调用之前,则应在函数定义中给出默认值。如果函数的定义在函数调用之后,则在函数调用之前需     要有函数声明,此时必须在函数声明中给出默认值,在函数定义时可以不给出默认值。
(2)一个函数不能既作为重载函数,又作为有默认参数的函数。因为当调用函数时如果少写一个参数,系统无法判定是利用重载函数还是利用默认参数的函数,出现二义性,系统无法执行。
(3)实参与形参的结合是从左至右顺序进行的。因此指定默认值的参数必须放在形参表列中的最右端,否则出错
(4)不能将实际值传递给引用类型的参数。可以将变量作引用类型参数的默认值,这时变量必须是已经声明且是全局变量。
      声明函数时,要将类或结构中定义 的静态成员变量作为默认值,若该类或结构还未创建实例,那要在此静态成员变量前加上作用       域操作符(::)。
     若已声明了类或结构的实例,则引用其成员变量作为函数参数的默认值,就要在变量前加上实例名和成员操作符(.)。

(5)默认值的限定

  默认值可以是全局变量、全局常量,甚至是一个函数。例如:
    int a=1;
    int fun(int);
    int g(int x;fun(a)); //ok:允许默认值为函数

  默认值不可以是局部变量,因为默认参数的函数调用是在编译时确定的,而局部变量的位置与值在编译时均无法确定。例如:
    void fun()
    {
     int i;
     void g(int x=i); //error:处理g()函数声明时,i不可见
    }

(6)与不带默认值参数的函数相比
 int ret  = sum(a, b);
012117DC  mov         eax,dword ptr [b]  
012117DF  push        eax  
012117E0  mov         ecx,dword ptr [a]  
012117E3  push        ecx  
012117E4  call        sum (01211069h)  
012117E9  add         esp,8  
012117EC  mov         dword ptr [ret],eax  
  sum(1, 2);
012117EF  push        2  
012117F1  push        1  
012117F3  call        sum (01211069h)  
012117F8  add         esp,8  
与不带默认值参数的函数相比,两者同样都要执行传参压栈操作。
当参数的默认值为变量时:压栈前需要从内存获取值(sum(a, b))
当参数的默认值为常量时:压栈的是立即数(sum(a, 2))

参考:http://blog.csdn.net/vlily/article/details/7247888
http://www.cnblogs.com/graphics/archive/2010/07/15/1778291.html
阅读(1034) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~