函数的默认参数值,即在定义参数的时候同时给它一个初始值。在调用函数的时候,我们可以省略含有默认值的参数。也就是说,如果用户指定了参数值,则使用用户指定的值,否则使用默认参数的值。

void Func(int i = 1, float f = 2.0f, double d = 3.0)
{
cout << i << ", " << f << ", " << d << endl ;
} int main(void)
{
Func() ; // 1, 2, 3
Func(10) ; // 10, 2, 3
Func(10, 20.0f) ; // 10, 20, 3
Func(10, 20.0f, 30.0) ; // 10, 20, 30
return 0 ;
}

参数的值也可以是表达式,这样,表达式将在函数被调用的时候求值,比如下面的func函数,第二个参数值是通过函数调用得到的,每次调用func函数时,该函数都会调用getValue来获取b的值。

class Test
{
public: static int getValue()
{
return 1;
} int func(int a, int b = getValue())
{
return b;
}
} ;

如果某个参数是默认参数,那么它后面的参数必须都是默认参数

下面两种情况都可以

void Func(int i, float f = 2.0f, double d = 3.0) ;
void Func(int i, float f, double d = 3.0) ;

但是这样就不可以

void Func(int i, float f = 2.0f, double d) ;

默认参数的连续性能保证编译器正确的匹配参数。所以可以下这样一个结论,如果一个函数含有默认参数,那么它的最后一个参数一定是默认参数。

默认参数可以放在函数声明或者定义中,但只能放在二者之一

通常我们都将默认参数放在函数声明中,因为如果放在函数定义中,那么将只能在函数定义所在地文件中调用该函数。(为什么呢?)

.h文件

class TestClass
{
public:
void Func(int i, float f, double d) ;
};

.cpp文件

#include "TestClass.h"

void TestClass::Func(int i = 1, float f = 2.0f, double d = 3.0)
{
cout << i << ", " << f << ", " << d << endl ;
}

像上面这样,只能够在TestClass.cpp中调用Func函数。岂不是很痛苦?

函数重载时谨慎使用默认参数值

比如下面两个重载函数func,一个只接受一个参数,而另一个接受两个参数,包括一个默认参数。

class Test
{
public:
int func(int a)
{
return a;
} int func(int a, int b = 1)
{
return a + b;
}
} ;

如果像下面这样调用函数

int main(void)
{
Test test;
int result = test.func(1); getchar() ;
return 0 ;
}

则编译器就不知道选择哪个函数,这就造成了混淆。

==

作者:zdd

C++默认参数(转)的更多相关文章

  1. python中的默认参数

    https://eastlakeside.gitbooks.io/interpy-zh/content/Mutation/ 看下面的代码 def add_to(num, target=[]): tar ...

  2. python3 函数的形参、实参、位置参数、默认参数、关键字参数以及函数的递归

    python 版本 3.5 #Author by Andy#_*_ coding:utf-8 _*_def func(x,y=2): print('我是形参%s'%x) print('我是默认参y-- ...

  3. [c++]默认参数

     =================默认参数==================在函数声明时表明默认值,在函数定义时正常定义void function(int a = 2)// 函数声明void fu ...

  4. ES6函数默认参数(Default Parameters)

    语言更新时每一个新增的特性都是从千百万开发者需求里提取过来的,规范采用后能减少程序员的痛苦,带来便捷. 我们经常会这么写 function calc(x, y) { x = x || 0; y = y ...

  5. C++中函数的默认参数和C语言中volatile的学习

    1.函数默认参数 1 int func(int a,int b=10) 2 { 3 return a*b; 4 } 5 6 int main() 7 { 8 int c=func(2); 9 cout ...

  6. 【matlab】设定函数默认参数

    C++/java/python系列的语言,函数可以有默认值,通常类似如下的形式: funtion_name (param1, param2=default_value, ...) 到了matlab下发 ...

  7. Delphi函数参数传递 默认参数(传值)、var(穿址)、out(输出)、const(常数)四类

    Delphi的参数可以分为:默认参数(传值).var(传址).out(输出).const(常数)四类 可以对比C/C++的相关知识,类比学习. 1.默认参数是传值,不会被改变,例子 function ...

  8. 我的c++学习(6)默认参数和内联函数

    默认参数 一般情况下,函数调用时实参个数应与形参相同,但为了更方便地使用函数,C++也允许定义具有默认参数的函数,这种函数调用时实参个数可以与形参不相同.“默认参数”指在定义或声明函数时为形参指定默认 ...

  9. 海蜘蛛WiFiDog固件 MTK7620 OEM,带云AC功能、探针、广告插入,MTK7620解包打包维修默认参数

    修改内容: 1.系统默认管理员员帐号密码 2.系统默认LAN 接口地址 3.系统默认DHCP及保留地址 4.系统默认云AC远程地址及协议内容 5.系统默认JS插入地址 6.系统默认探针位置 7.默认顶 ...

  10. c++有默认参数的函数---4

    原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/ 1.默认参数的目的 C++可以给函数定义默认参数值.通常,调用函数时,要为函数的每个参数给定对应的实参. ...

随机推荐

  1. C# 堆和栈的区别-该文转自:http://www.itcodes.cn/746.html | 程序人生

    理解堆与栈对于理解.NET中的内存管理.垃圾回收.错误和异常.调试与日志有很大的帮助.垃圾回收的机制使程序员从复杂的内存管理中解脱出来,虽然绝大多数的C#程序并不需要程序员手动管理内存,但这并不代表程 ...

  2. 用Java实现3DES

    3DES,即三重DES,是DES的加强版,也是DES的一个更安全的变形.它使用3个56位(共168位)的密钥对数据进行三次加密,和DES相比,安全性得到了较大的提高. 实际上,3DES是一个过渡的加密 ...

  3. iOS 中使用md5加密

    #import <CommonCrypto/CommonDigest.h> @implementation MD5Util +(NSString *)encode:(NSString *) ...

  4. [转]基于AngularJS的前端架构(上)

    模块化 怎么分模块 AngularJS自己有模块的概念,但只是为controller.direcitive.service等提供一个集合的概念,并没有文件调度的功能. 官方推荐的模块分类方法是: an ...

  5. JSON数组操作

    在jquery中处理JSON数组的情况中遍历用到的比较多,但是用添加移除这些好像不是太多. 今天试过json[i].remove(),json.remove(i)之后都不行,看网页的DOM对象中好像J ...

  6. 学习笔记--HashMap浅析

    HashMap 实现了Map 接口,其底层以一个线性数组保存哈希表,所以它既有数组查询的高效,也有哈希存取的方便. HashMap提供了默认构造器,和有参构造器,在有参构造器中,提供了两个参数,可以对 ...

  7. Linux常用命令查看日志

    cattail -f日 志 文 件 说 明 /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一 /var/log/secure 与安全相关的日 ...

  8. 【BZOJ】【1863】【ZJOI2006】trouble 皇帝的烦恼

    二分+DP Orz KuribohG 神题啊= = 满足单调性是比较显然的…… 然而蒟蒻并不会判断能否满足……QwQ 神一样的DP姿势:f[i]表示第 i 个与第1个最多有多少个相同,g[i]表示最少 ...

  9. 【BZOJ】【2631】Tree

    LCT 又一道名字叫做Tree的题目…… 看到删边加边什么的……又是动态树问题……果断再次搬出LCT. 这题比起上道[3282]tree的难点在于需要像线段树维护区间那样,进行树上路径的权值修改&am ...

  10. SQL Server表分区案例

    --学习创建表分区脚本/*SQL SERVER 2005中以上版本,终于引入了表分区,就是说,当一个表里的数据很多时,可以将其分拆到多个的表里,大大提高了性能.下面举例子说明之*/ --------- ...