C++中函数参数的扩展
1,C++ 可以看成是一种更好的 C 语言,所以 C++ 会考虑 C 的欠缺部分,然后给 与一些补充和扩展,本节课讲述 C++ 对函数参数的非常重要的扩展;
2,函数参数的默认值:
1,C++ 中可以在函数声明时为参数提供一个默认值;
1,也可以在函数声明和定义在一起的时候来提供默认值;
2,作用是当函数调用时没有提供参数的值,则使用默认值;
3,int mul(int x = 0); // 函数的前项声明,这里使用了默认值;
- int main(int argc, char* argv[])
- {
- printf("%d\n", mul()); // mul(0)
- return ;
- }
- int mul(int x) //函数声明的时候提供默认值,定义的时候没有必要提供;
- {
- return x * x;
- }
3,参数的默认值必须在函数声明中指定:
1,问题:
1,函数定义中是否可以出现参数的默认值?
1,不可以,编译出错;
2,当函数声明和定义在一起的时候,可以出现参数的默认值;
2,当函数声明和定义中的参数默认值不同时会发生什么?
1,不可以,编译出错;
2,代码示例:
- int mul(int x = );
- // ...
- int mul(int x = )
- {
- return x * x;
- }
3,默认参数值初探实例分析:
1,main.cpp 文件:
- #include <stdio.h>
- int mul(int x = );
- int main(int argc, char *argv[])
- {
- printf("%d\n", mul());
- printf("%d\n", mul(-));
- printf("%d\n", mul());
- return ;
- }
- int mul(int x)
- {
- return x * x;
- }
- /*
- int mul(int x = 5) // error: default argument given for parameter 1 of 'int mul(int)'
- {
- return x * x;
- }
- */
2,输出结果:
0
1
4
3,当上述代码用 C 语言编译时,第三行有错,证明了函数参数的默认值 是 C++ 语言对 C 语言的一个扩展;
4,函数默认参数的规则:
1,函数设计时,多个参数的默认值必须从右向左提供;
1,这个设计,是指函数声明或者函数声明和定义在一起的时候;
2,函数调用时,使用了默认值,则后续参数必须使用默认值;
- int add(int x, int y = , int z = ) // 这里即是声明,也是调用;
- {
- return x + y + z;
- }
- add(); // x = 0, y = 1, z = 2;
- add(, ); // x = 2, y = 3, z = 2;
- add(, , ); // x = 3, y = 2, z = 1;
5,默认参数的错误示例编程实验:
1,main.cpp 文件:
- #include <stdio.h>
- int add(int x, int y = , int z = ); //当 z 未提供默认值的时候,编译器显示:error: default argument missing for parameter 3 of 'int add(int, int, int)'
- int main(int argc, char *argv[])
- {
- printf("%d\n", add());
- printf("%d\n", add(, ));
- printf("%d\n", add(, , ));
- return ;
- }
- int add(int x, int y, int z)
- {
- return x + y + z;
- }
2,输出结果:
1
3
6.
6,函数占位参数:
1,在 C++ 中可以为函数提供占位参数;
1,占位参数只有参数类型声明,而没有参数名声明;
1,占位参数本质也是函数参数;
2,占位参数:有类无名;
2,一般情况下,在函数体内部无法使用占位参数;
1,没有名字,所以在函数体内部无法使用;
2,代码示例:
- int func(int x, int)
- {
- return x;
- }
- // ...
- func(, ); // ok,这是占位参数的用途;
7,函数占位参数的意义:
1,占位参数与默认参数结合起来使用;
2,兼容 C 语言程序中可能出现的不规范写法;
1,void func(); 与 void func(void); 两种声明方式等价吗?
1,在 C 语言中,前者接受任意多参数,后者不接受参数,因此不 等价;
2,在 C++ 语言中,等价;
2,在 C++ 中,最少的改动,就能够兼容 C 程序,且不用带来 bug;
3,代码示例:
- #include <stdio.h>
- void func() // 从 C 到 C++,更改为 void func(int, int)即可;
- {
- }
- int mian(int argc, char* argv[])
- {
- // func(); //若在 C 中也有这一行代码,C++ 中只用占位参数时,这里错误,可以结合默认参数值,更改为 void func(int = 0, int = 0);
- func(, ); // C++ 中不用占位参数时,这里错误;
- return ;
- }
8,占位参数与默认参数值编程实验:
1,main.cpp 文件:
- #include <stdio.h>
- int func(int x, int = );
- int main(int argc, char *argv[])
- {
- printf("%d\n", func()); // 利用默认参数;
- printf("%d\n", func(, )); // 利用占位参数;
- return ;
- }
- int func(int x, int)
- {
- return x;
- }
9,小结:
1,C++ 中支持函数参数的默认值;
2,如果函数调用时没有提供参数值,则使用默认值;
3,参数的默认值必须使从右向左提供;
4,参数调用时使用了默认值,则后续参数必须使用默认值;
5,C++ 中支持占位参数,用于兼容 C 语言中的不规范写法;
C++中函数参数的扩展的更多相关文章
- (转)python中函数参数中如果带有默认参数list的特殊情况
在python中函数参数中如果带有默认参数list遇到问题 先看一段代码 1 2 3 4 5 6 7 8 9 def f(x,l=[]): for i in range(x): ...
- c语言中函数参数入栈的顺序是什么?为什么
看到面试题C语言中函数参数的入栈顺序如何? 自己不知道,边上网找资料.下面是详细解释 #include <stdio.h> void foo(int x, int y, int z){ ...
- python中函数参数的引用方式
值传递和引用传递时C++中的概念,在python中函数参数的传递是变量指向的对象的物理内存地址!!! python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是“传对象引用”的方 ...
- php与js中函数参数的默认值设置
php函数参数默认值设置: <?phpfunction test($val=3){ echo $val."<br/>";}test(11);test();?& ...
- JavaScript中函数参数的按值传递与按引用传递(即按地址传递)
首先声明一句:JavaScript中所有函数的参数都是按值传递的!不存在按引用传递! 在讲传递参数之前我们先来讲一下指针. 学过C指针的应该都知道,指针变量中保存的是一个地址,程序可以根据所保存的地址 ...
- JS中函数参数和函数返回值的理解
函数本质就是功能的集合 JS中函数是对象,因此,函数名实际上仅仅是一个指向函数对象的指针,不会与某个函数绑定,所以,JS中没有重载(重载就是通过传递不同类型的参数,使两个相同函数名的函数执行不同的功能 ...
- JavaScript中函数参数的值传递和引用传递
结论: 对于数字.字符串等基本类型变量,是将它们的值传递给了函数参数,函数参数的改变不会影响函数外部的变量. 对于数组和对象等是将对象(数组)的变量的值传递给了函数参数,这个变量保存的指向对象(数组) ...
- C++解析(6):函数参数的扩展
0.目录 1.函数参数的默认值 2.函数默认参数的规则 3.函数占位参数 4.小结 1.函数参数的默认值 C++可以在函数声明时为参数提供一个默认值 当函数调用时没有提供参数的值,则使用默认值 参数的 ...
- Delphi 中 函数参数中的 const 修饰符的本质以及注意事项
来自:http://blog.csdn.net/farrellcn/article/details/9096787 ------------------------------------------ ...
随机推荐
- 13. ClustrixDB 基于时间点恢复
在不太可能发生灾难的情况下,可以在特定数据库.表或整个集群上执行ClustrixDB集群的某个时间点恢复.应该非常小心地处理这一问题. 先决条件 在你可以使用时间点恢复之前,你的集群应该有几个先决条件 ...
- java中System类
System作为系统类,在JDK的java.lang包中,可见它也是一种java的核心语言特性.System类的构造器由private修饰,不允许被实例化.因此,类中的方法也都是static修饰的静态 ...
- Python连接MySQL之Python库pymysql
连接数据库 pymysql连接数据库的方式和使用sqlite的方式基本相同: 使用connect创建连接对象 connect.cursor创建游标对象,SQL语句的执行基本都在游标上进行 cursor ...
- Lucene实践:全文检索的基本原理
一.总论 根据http://lucene.apache.org/java/docs/index.html 定义: "Apache Lucene(TM) is a high-performan ...
- 【BZOJ3876】 [Ahoi2014]支线剧情
Description [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情.这些游戏往往 都有很多的支线剧情,现 ...
- 【技术分享:python 应用之三】使用 python 修改 excel 表格的 sheet 名称
原始需求:已经下载好了 Excel 文件,但是 Excel 里的 sheet 的名称想要修改一下,比如原本默认的是sheet1,需要修成“DNEWCD_JQJSHMX”.需求比较简单,直接上代码吧! ...
- (61)C语言预处理命令详解
一 前言 预处理(或称预编译)是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作.预处理指令指示在程序正式编译前就由编译器进行的操作,可放在程序中任何位置. 预处理是C语言的一个重要功能 ...
- 学习日记21、IE下的Ajax需要注意的地方
上面这张图片我是封装了一个easyui下拉框,红框出则是动态传入的json数据,这串代码在google下运行不会有任何问题,但是在IE下运行则会提示缺少:,这是因为IE只识别json格式的数据,所以这 ...
- join的源码
long base = System.currentTimeMills(); long now = 0; if(millis < 0){ throw new IllegalArgumentE ...
- CDH安装时,部分节点不受管控
解决方案: /opt/cm-5.12.0/etc/init.d/cloudera-scm-agent stop cd /opt/cm-5.12.0/lib/cloudera-scm-agent/ rm ...