函数定义默认参数
Posted LC编程开发者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数定义默认参数相关的知识,希望对你有一定的参考价值。
函数定义默认参数
在调用一个函数的时候,函数的实参传递给形成。因此实参的个数应与形参个数相同。但是,有时多次调用同一函数的时候,传递相同的实参。那么,能否省去实参的输入,自动给形参传递一个数值?
C++提供简单的处理办法,给形参设置一个默认值,这样形参就不必一定要从实参取值了,如下是一个函数声明:
float get_length(float r = 6.5) //函数get_length的参数r 设置默认值6.5
指定参数r 的默认值为6.5,如果在调用此函数的时候,参数 r 的值为6.5,则可以不必给出实参的值,如:
get_length(); //调用该函数,没有传递参数,就参数r 就是要默认值6.5
如果不想使用形参设置的默认值,则通过实参另行给出,如:
get_length(8.5); //给参数r 传递了实参8.5,那么,就是传递值给参数r,而不是默认的6.5数值;
这种方法比较灵活,可以简化编程,提高运行效率。
如下是一个测试例子:
程序运行结果如下:
可以看到,定义了get_size()函数,并且设置了默认参数。那么,当调用get_size()函数,不设置参数的时候,就是使用默认参数。
如果有多个形参,可以设置每一个形参有一个默认值,也可以只对一部分形参指定默认值。例如,有一个求“圆柱体体积”的函数,形参 h 代表圆柱体的高,r 为圆柱体的半径,函数的原型如下:
float volume(float h, float r = 12.6) //只对形参r 指定默认值12.6
函数调用可以采用以下形式:
volume(6); //相当于volume(6, 12.6)
volume(6, 8); //相当于h 的值为6, r 的值为8
实参与形参的结合是从左到右顺序进行的,第1个实参必然与第1个形参结合,第2个实参必然与第2个形参结合,因此,指定默认值的参数必须放在形参列表中的最右端,否则出错。例如:
void f1(float a, int b = 0, int c, char d = 'a') //错误
void f2(float a, int c, int b = 0, char d = 'a') //正确
如果要调用上面的 f2() 函数,可以采取下面的形式:
f2(3.5, 5, 3, 'x') //形参的值全部从实参得到
f2(3.5, 5, 3) //最后一个形参的值取默认值'a'
f2(3.5, 5) //最后两个形参的取值为默认值b = 0, d = 'a'
可以看到,在调用有默认参数的函数时,实参的个数可以与形参不同,没有设置实参的函数,形参的值从函数的默认参数中获取。利用这一特性,可以使函数的使用更加灵活。
注意:一个函数不能即作为重载函数,又作为有默认参数的函数。因为,当调用函数时如果少写一个参数,系统无法判断是利用重载函数还是利用默认参数的函数,会出现二义性,系统无法执行。例如:
此时,我们定义max()函数,有两个不同的max()函数定义,所以,是重载函数。而且,第一个max()函数,我们设置了参数默认值。
那么,我们在main()函数中,没有对max()函数有任何调用,所以,编译运行如下:
可以看到,程序编译运行OK,正确执行程序。
那么,我们在main()函数中,调用max()函数,假设有如下的调用:
程序编译结果如下:
可以看到,编译提示错误!因为,编译器无法确定是调用哪一个函数,执行max(1, 2)函数,到底是调用哪一个函数?编译器无法确定,所以,编译错误。
所以,我们不可以重载函数的时候,有设置有默认参数,让函数调用有二义性的代码。
总结
本章节我们学习了C++的基础知识,学习如何编写、编译、运行一个C++程序。我们使用.cpp后缀的文件来存放C++的代码,然后,使用g++来编译程序。
韦凯峰 Linux C/C++ 程序设计教程,Linux 系统编程,Openwrt 系统开发,微信:13926572996,QQ:1523520001,博客:www.mylinux.vip
以上是关于函数定义默认参数的主要内容,如果未能解决你的问题,请参考以下文章