原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/

1.默认参数的目的

  C++可以给函数定义默认参数值。通常,调用函数时,要为函数的每个参数给定对应的实参。例如:

 void delay(int loops); //函数声明
    void delay(int loops) //函数定义
    {
     if(100ps==)
      return;
      for(int i=;i<loops,i++);
    }

  无论何时调用delay()函数,都必须给loops传一个值以确定时间。但有时需要用相同的实参反复调用delay()函数。C++可以给参数定义默认值。如果将delay( )函数中的loops定义成默认值1000, 只需简单地把函数声明改为:

void delay(int loops=); 

这样,无论何时调用delay()函数,都不用给loops赋值,程序会自动将它当作值1000进行处理。例如,调用:

 delay(); //loops设置为2500
 delay(); //ok:loops采用默认值1000

  调用中,若不给出参数,则按指定的默认值进行工作。
  允许函数默认参数值,是为了让编程简单,让编译器做更多的检查错误工作。

2.默认参数的声明
  默认参数在函数声明中提供,当又有声明又有定义时,定义中不允许默认参数。如果函数只有定义,则默认参数才可出现在函数定义中。例如:

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

3.默认参数的顺序规定
  如果一个函数中有多个默认参数,则形参分布中,默认参数应从右至左逐渐定义。当调用函数时,只能向左匹配参数。例如:

void func(int a=,int b,int c=, int d=); //error 
void func(int a, int b=,int c=,int d=); //ok

  对于第2个函数声明,其调用的方法规定为: 

func(,,,); //ok:调用时给出所有实参
func(); //error:参数a没有默认值
func(i2,); //ok:参数c和d默认
func(,,); //error:只能从右到左顺序匹配默认

4.默认参数与函数重载
  默认参数可将一系列简单的重载函数合成为一个。例如, 下面3个重载函数:

void point(int,int){//...}
void point(int a){return point(a,);}
void point(){return point(,);}

  可以用下面的默认参数的函数来替代:

void point(int=,int=);

  当调用“point();”时,即调用“point(3,4);” 它是第3个声明的重载函数。
  当调用“point(6);”时,即调用“point(6,4);”,它是第2个声明的重载函数。
  当调用“point(7,8);”时,即调用第1个声明的重载函数
  如果一组重载函数(可能带有默认参数)都允许相同实參个数的调用,将会引起调用的二义性。例如:

void func(int); //重载函数之一
void func(int,int=); //重载函数之二,带有默认参数
void func(int=,int=); //重载函数之三,带有默认参数
func(); //error: 到底调用3个重载函数中的哪个?
func(,) //error:到底调用后面2个重载函数的哪个?

5.默认值的限定
  默认值可以是全局变量、全局常量,甚至是一个函数。例如:

int a=;
int fun(int);
int g(int x;fun(a)); //ok:允许默认值为函数

 默认值不可以是局部变量,因为默认参数的函数调用是在编译时确定的,而局部变量的位置与值在编译时均无法确定。例如:

void fun()
{
  int i;
  void g(int x=i); //error:处理g()函数声明时,i不可见
}

本章小结
  随着程序量和程序复杂度的不断增加,最好的办法是把程序分成更小,更容易管理的模块,这种模块就是函数。
  函数名最好能反映出所要完成的任务。
  函数可以把数据返回给调用者,若函数要返回一个值,必须在函数名前规定返回值的类型,若函数没有返回值,则类型为void。
  程序通过参数把信息传递给函数,若函数需要接受参数,就必须给参数指定名称及类型。
  C++必须知道函数的返回类型以及接受的参数个数和类型, 如果函数的定义出现在函数调用之后,就必须在程序的开始部分用函数原型进行声明。
  局部变量是在函数内部定义的,只能被定义该变量的函数访问。全局变量是指其作用域贯穿程序始终的变量。定义全局变量要在程序开始时进行,并且放在所有函数的外面。
  静态局部变量是在函数内部定义,但生命期却随函数的第一次被调用而产生, 随程序的结束而结束, 静态局部变量只能在定义该变量的函数中可见。
  函数调用机制是由栈操作的过程实现的。函数可以递归调用。函数定义不能放在任何函数定义的里面。
  内联函数是为了提高编程效率而实现的, 它克服了用#define宏定义所带来的弊病。
  函数重载允许用同一个函数名定义多个函数。连接程序会根据传递给函数的参数数目、类型和顺序调用相应的函数。函数重载使程序设计简单化,程序员只要记住一个函数名,就可以完成一系列相关的任务。
  在函数定义中通过赋值运算,即可指定默认参数值。一旦程序在调用函数时默认了参数值, 函数就使用默认参数值。 不允许在参数中间使用默认值。指定默认参数值可以使函数的使用更为简单,同时也增强了函数的可重用性。

c++有默认参数的函数---4的更多相关文章

  1. [C++程序设计]有默认参数的函数

    实参与形参的结合是从左至右顺序进行的.因此指定默认值的参数必须放在形参表列中的最右端,否 则出错.例如: void f1(float a,int b=0,int c,char d=′a′); //不正 ...

  2. PHP_零基础学php_3PHP函数、传参函数、默认参数、函数返回值

    <?php function say_hello() //无参数 { $name="tang"; echo "hello,".$name; echo &q ...

  3. C++ 函数 函数的重载 有默认参数的函数

    函数的重载 C++允许用同一函数名定义多个函数,这些函数的参数个数和参数类型不同.这就是函数的重载(function overloading). int max1(int a,int b, int c ...

  4. 【c++】类中带默认参数的函数

    反思两个问题 1. 带默认参数的函数,为何声明.定义不能同时有参数? 2. 带默认参数的函数, 为何带默认参数的参数靠后站? 上程序 #include <iostream> #includ ...

  5. php课程 3-12 带默认参数的函数怎么写

    php课程 3-12 带默认参数的函数怎么写 一.总结 一句话总结:多看学习视频啊 1.带默认参数的函数怎么写? 直接等于号接默认参数,和js里面一模一样 2.带默认参数的函数的注意事项是什么? 默认 ...

  6. js课程 2-7 带默认参数的函数怎么写

    js课程 2-7 带默认参数的函数怎么写(注意参数顺序) 一.总结 一句话总结:默认参数一定要放在最后面,而且还有注意你调用参数的时候给参数的顺序习惯.直接加个等于号就可以是默认参数.function ...

  7. Python基础之定义有默认参数的函数

    1. 构建有默认参数的函数 当我们在构建一个函数或者方法时,如果想使函数中的一个或者多个参数使可选的,并且有一个默认值,那么可以在函数定义中给参数指定一个默认值,并且放到参数列表的最后就行了.比如: ...

  8. C++默认参数与函数重载 注意事项

    一.默认参数在C++中,可以为参数指定默认值.在函数调用时没有指定与形参相对应的实参时, 就自动使用默认参数. 默认参数的语法与使用:(1)在函数声明或定义时,直接对参数赋值.这就是默认参数:(2)在 ...

  9. c++——默认参数、函数占位参数

    2 默认参数 /*1 C++中可以在函数声明时为参数提供一个默认值, 当函数调用时没有指定这个参数的值,编译器会自动用默认值代替 */ void myPrint(int x = 3) { printf ...

随机推荐

  1. Mongoose 是什么?

    Mongoose 参考手册 标签(空格分隔): MongoDB 一般我们不直接用MongoDB的函数来操作MongoDB数据库 Mongose就是一套操作MongoDB数据库的接口. Schema 一 ...

  2. 【codevs2370】小机房的树 LCA 倍增

    2370 小机房的树  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0 ...

  3. 一步步学习JSON

    什么是Json json是JavaScript Object Notation(javascript对象表示法)的缩写,是一种轻量的数据格式,是基于javascript的一个子集.与XML一样,jso ...

  4. android listview综合使用示例_结合数据库操作和listitem单击长按等事件处理

    本示例说明: 1.自定义listview条目样式,自定义listview显示列数的多少,灵活与数据库中字段绑定. 2.实现对DB的增删改查,并且操作后listview自动刷新. 3.响应用户操作点击事 ...

  5. linux之开发板与宿主机通信--ftp使用

    在目标板终端上输入命令: # ftp 192.16.77.66    //192.16.77.66是宿主机IP # cd /home/ //这里可以使用linux命令,但不能使有TAB键 # get ...

  6. 使用siege进行Web压力测试

    因为最近公司线上node项目出一些不稳定的情况,考虑在这方面能不能做进一步的优化,既然要做优化首先要知道问题出在哪里? 因为暂无法定位是node层问题还是api层出现问题,由于在开发环境小并发量程序运 ...

  7. [网络技术]VPN设置

    1.解决VPN服务器默认路由困扰 现在移动办公已经变得家常便饭,每次外出出差办公需要访问单位的内网服务器时,该怎么办呢?相信很多人都想到了VPN连接!的确,使用VPN连接, 我们可以利用现成的Inte ...

  8. (转)UIApplication sharedApplication详细解释-IOS

    iPhone应用程序是由主函数main启动,它负责调用UIApplicationMain函数,该函数的形式如下所示: int UIApplicationMain ( int argc, char *a ...

  9. PHP笔记(一)

    1. public 表示全局,类内部外部子类都可以访问:private表示私有的,只有本类内部可以使用:protected表示受保护的,只有本类或子类或父类中可以访问: 2. ==是包括变量值与类型完 ...

  10. 《day16_多线程细节_Eclipse使用》

    多线程的一些细节: 1,面试题:sleep方法和wait方法异同点是什么? 相同点:可以让线程处于冻结状态. 不同点: 1, sleep必须指定时间. wait可以指定时间,也可以不指定时间. 2, ...