函数的缺省参数
函数在定义或者声明的时候,将参数列表中的某一项或某几项参数给定为默认值,在后续的调用过程中我们可以不给缺省的形参传递实参数据,这样该函数会使用我们在定义或者声明时使用的默认参数。当然你可以传入你自己实际需要的参数这样函数内部就会使用你传入的参数。
注意:
- 函数的缺省参数在定义或者声明时给出,且只在一处给出,声明中给了之后就不能在定义中再次给默认参数。
- 缺省参数在参数列表中的位置必须是从右向左且连续给出。必须保证无缺省参数在前,缺省参数在后,缺省参数之后不能再出现无缺省参数。
- 缺省参数的默认值一般选择全局变量或者常量。
程序实例:
#include <iostream>
using namespace std;
int add(int a,int b=0,int c=0);//声明处给出默认值,缺省参数从右向左给出
int main()
{
cout<<add(1,2,3)<<endl;
cout<<add(1,2)<<endl;
cout<<add(1)<<endl;
return 0;
}
int add(int a,int b,int c)
{
return a+b+c;
}
运行结果:
函数重载
在C语言中,我们在同一作用域下定义两个同名但功能不同的函数时,会发生重定义错误;但是在c++中引入了函数重载,它解决了同一作用域下不同功能(主要是参数列表不同)函数名冲突的问题,它的区分方法主要是通过因为形参列表,当两个函数名字同名时,c++编译器可以通过参数列表来判断这两个函数是否发生重定义,如果参数列表也相同,那就构成重定义;当形参列表不相同时就不是重定义而是构成了重载关关系。
注意:
- 函数的重载关系和缺省无关,当两个函数的名字和参数列表均相同时,其中一个为缺省参数,那么也将发生函数重定义。
- 函数的返回值类型和是否重载无关,返回值是否相同对重载是没有影响的
#include <iostream>
using namespace std;
int add(int a,int b=0,int c=0);//声明处给出默认值,缺省参数从右向左给出
int add(int c,int b)
{
return c+b;
}
float add(int a,float b)
{
return a+b;
}
int main()
{
float var=3.4;
cout<<add(1,2,3)<<endl;
cout<<add(1)<<endl;
cout<<add(1,var)<<endl;
return 0;
}
int add(int a,int b,int c)
{
return a+b+c;
}
运行结果:
名字修饰
那么为什么c语言只要函数同名就会出现函数重定义,而c++可以允许函数名相同且不会发生重定义呢?
原因在于c语言和c++的编译过程对函数的名字修饰不同,名字修饰就是在编译过程中编译器将变量、函数等的名称重新改编的机制,重新修饰成为一个全局唯一的名称。那么c原因和c++对于函数的名字修饰不同在什么地方呢?
代码示例:
//.cpp文件
#include <iostream>
#include <array>
using namespace std;
void add(int, int);
int main()
{
add(0, 0);
return 0;
}
//.c文件
#include <stdio.h>
void add(int, int);
int main()
{
add(0, 0);
return 0;
}
其中这两个函数都是没有实际定义的,我们来看一次他们的内部标识符是什么样子?
c++中不光函数名参与了名字修饰,函数的参数列表也参与了名字修饰,这就是c++为什么能够同名函数重载的原因。
我们在使用重载和缺省函数的过程中,注意设计方法和思路,避免冲突,就比如下种情况:
#include <iostream>
using namespace std;
int add(int a,int b=0,int c=0);//声明处给出默认值,缺省参数从右向左给出
int add(int c,int b)
{
return c+b;
}
int main()
{
cout<<add(1,2)<<endl; //调用出错,不知道该调用那个?函数调用发生歧义
return 0;
}
int add(int a,int b,int c)
{
return a+b+c;
}
两个add函数是可以构成重载关系,但是看完后你觉得程序编译可以通过吗?
其实在调用add(1,2)时,会出现歧义,这两个函数均可以调用,编译器这时就不知道该调用哪一个了。其实当我们有了缺省参数之后就不需要 int add(int c,int b)函数了,我们只需要将第一个add函数第三个参数的默认值设为0就可以达到同样的功能,而且还可以计算三个数相加,这就是缺省参数出现的意义。