C++函数系列篇:函数的默认值+带默认参数的函数
来源:互联网 发布:合肥宝德网络 编辑:程序博客网 时间:2024/05/06 02:48
4.在调用时,若给已经设置默认值的参数传递实际值,既要取代默认值,则在参数表中被取代参数的左边所定义的所有参数,无论是否有默认值,都必须传递实际参数。
这也是因为函数调用时可不列出已设置默认值的参数。假若被取代参数的左边既有设置了默认值的参数也有未设置默认值的参数,若不对其左边的所有参数传递实际参数,编译器也就无法分辨传递的这个取代值到底要传递给哪个参数。
例如有以下函数声明:
int FunctionOne(int x,int y=0,int z=0,int w=0);
我们要给z 传递整型值8,作如下调用:
FunctionOne(8);
显然,编译器无法确定这个8 到底要传递给哪个参数。为了达到我们的目的,必须这样调用:
FunctionOne(0,0,8);
这是x 被传递了0,y 被传递了 0,z 被传递了8
----------------------------------------------------------------------------------------------------------------------------------------------------------
默认参数的函数
1.默认参数的目的
C++可以给函数定义默认参数值。通常,调用函数时,要为函数的每个参数给定对应的实参。例如:
void delay(int loops); //函数声明
void delay(int loops) //函数定义
{
if(100ps==0)
return;
for(int i=0;i<loops,i++);
}
无论何时调用delay()函数,都必须给loops传一个值以确定时间。但有时需要用相同的实参反复调用delay()函数。C++可以给参数定义默认值。如果将delay( )函数中的loops定义成默认值1000, 只需简单地把函数声明改为:
void delay(int loops=1000);
这样,无论何时调用delay()函数,都不用给loops赋值,程序会自动将它当作值1000进行处理。例如,调用:
delay(2500); //loops设置为2500
delay(); //ok:loops采用默认值1000
调用中,若不给出参数,则按指定的默认值进行工作。
允许函数默认参数值,是为了让编程简单,让编译器做更多的检查错误工作。
2.默认参数的声明
默认参数在函数声明中提供,当又有声明又有定义时,定义中不允许默认参数。如果函数只有定义,则默认参数才可出现在函数定义中。例如:
void point(int=3,int=4); //声明中给出默认值
void point(intx,inty) //定义中不允许再给出默认值
{
cout <<x<<endl;
cout <<y<<endl;
}
3.默认参数的顺序规定
如果一个函数中有多个默认参数,则形参分布中,默认参数应从右至左逐渐定义。当调用函数时,只能向左匹配参数。例如:
void func(int a=1,int b,int c=3, int d=4); //error
void func(int a, int b=2,int c=3,int d=4); //ok
对于第2个函数声明,其调用的方法规定为:
func(10,15,20,30); //ok:调用时给出所有实参
func(); //error:参数a没有默认值
func(i2,12); //ok:参数c和d默认
func(2,15,20); //error:只能从右到左顺序匹配默认
4.默认参数与函数重载
默认参数可将一系列简单的重载函数合成为一个。例如, 下面3个重载函数:
void point(int,int){//...}
void point(int a){return point(a,4);}
void point(){return point(3,4);}
可以用下面的默认参数的函数来替代:
void point(int=3,int=4);
当调用“point();”时,即调用“point(3,4);” 它是第3个声明的重载函数。
当调用“point(6);”时,即调用“point(6,4);”,它是第2个声明的重载函数。
当调用“point(7,8);”时,即调用第1个声明的重载函数
如果一组重载函数(可能带有默认参数)都允许相同实參个数的调用,将会引起调用的二义性。例如:
void func(int); //重载函数之一
void func(int,int=4); //重载函数之二,带有默认参数
void func(int=3,int=4); //重载函数之三,带有默认参数
func(7); //error: 到底调用3个重载函数中的哪个?
func(20,30) //error:到底调用后面2个重载函数的哪个?
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不可见
}
- C++函数系列篇:函数的默认值+带默认参数的函数
- C++函数系列篇:函数的默认值+带默认参数的函数
- C++函数系列篇:函数的默认值+带默认参数的函数
- C++函数系列篇:函数的默认值+带默认参数的函数
- C++函数系列篇:函数的默认值+带默认参数的函数
- C++函数系列篇:函数的默认值+带默认参数的函数
- 函数的默认值+带默认参数的函数
- 函数的默认值与带默认参数的函数
- C和C++__带默认值参数的函数说明
- C和C++__带默认值参数的函数说明
- c++中函数的默认值和带默认参数的函数
- C++带参数默认值的函数
- 带默认值参数的函数说明
- C++中带默认值参数的函数
- c++带默认值参数的函数
- 带默认参数的函数
- 带默认参数的函数 .
- 带默认参数的函数
- Mackbook添加主机名和ip的映射
- switchoff
- PyGobject(五十七)布局容器之TreeView(下)——CellRenderer
- hdu5672尺取法
- Hive使用中的注意事项
- C++函数系列篇:函数的默认值+带默认参数的函数
- SVG环形进度条的实现方法
- WordPress 获取文章内容页特色图像地址
- C#通过webservice连接Oracle 9i数据库
- 时间序列实战(一)
- kudu master design(kudu主节点设计)
- 顶点着色器(1)
- poj 3268 (dijkstra)
- Python 内部函数