码字不易,养成习惯,先赞后看
函数重载介绍
函数重载概念
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明多个功能相似的同名函数。但是要求这些同名函数的形参列表(参数个数、类型或参数顺序)必须互相不同。
jwoof
注:重载函数只与形参列表有关,而与函数返回类型无关!
函数重载常见的具体举例
由于这函数重载这部分举例能更好说明函数重载的用法与作用,所以接下来我会举几个典型“栗子”
典例1
//典例一:参数列表中,参数类型不同的函数
//在这个例子中,我们很容易看到函数重载的优势,下面这种函数定义是被完全禁止的,所以
//要交换不同类型的数值,我们就要定义不同名的函数,十分复杂。但是在C++的函数重载的
//帮助下,只需要一个同名函数即可
void swap(int* a, int* b);
void swap(double* a, double* b);
jwoof
典例二
//典例二:参数列表中,参数个数不同
int Max(int a, int b, int c);
int Max(int a, int b);
jwoof
典例三
//典例三:参数列表中参数类型顺序不同
void Fun(int a, char b);
void Fun(char b, int a);
jwoof
典例四(错误示范)
//在这两个函数中,参数列表是完全相同的,只有返回值不同,所以这两个函数不不构成重载的
//在程序中定义这样的一组函数,一定会发生报错
void Fun(int a, int b);
int Fun(int a, int b);
总结:
1.能形成函数重载的一组函数的充分必要条件是:函数名相同,函数形参列表中形参的个数、顺序和类型不相同
2.函数重载与函数返回类型无关
3.函数重载能有效简化代码,简化函数命名,提高函数名称的可读性
为什么C++可以函数重载而C语言不行(函数重载的底层解释)
C语言:
一个C语言程序从实现到生成可执行文件要经历以下步骤
int add(int a, int b);
int main()
{
int ret = add(1, 2); //在调用这个函数时,有汇编码 call add(函数地址)
}
所以,如果在.c文件中定义多个同名函数,需要调用它们的时候,会生成相同的汇编代码,都是call add(地址)所以导致编译器不知道你具体要调用哪一个函数。所以就会出现报错。
C++语言:
同样,C++程序也会经历相同的程序过程(预处理-编译-汇编-链接)。那么C++又是用什么机制做到函数重载这项功能的呢?那么我们就要介绍一下函数名修饰
函数名修饰
在C++中当编译成汇编代码时:C中的 call add(函数地址)
而C++中被翻译成 call _Z3addii(函数地址)
下面举一个函数重载的例子
int add(int a ,int b);
double add(double a,double b);
在调用两个函数是分别是
call _Z3addii(函数地址)
call _Z3adddd(函数地址)
所以在调用不同重构函数时,汇编代码中调用的不是同一个函数,所以编译器就会知道具体时哪一种函数,所以就可以准确地找到要调用的函数。
缺省参数
缺省参数的概念
C++中缺省函数是可以将函数参数列表中的部分参数进行初始化,然后在调用函数时可以省略缺省的函数参数的实参。如果省略,那么函数将默认使用缺省参数的默认初始化值,若不省略,那么函数将使用传入的实参的值
举“栗子”
int add(int a,int b = 1) //将b缺省,并默认初始化
{
return a+b;
}
int main()
{
int ret = 0;
ret = add(1,2); //正常的调用函数,ret = 3
printf("%d\n",ret);
ret = add(1); //利用缺省函数调用,只将1传给了a因此b使用默认初始化值1.ret = 2
printf("%d\n",ret);
return 0;
}
注:
1.缺省参数时,赋予默认初始化值得参数必须从右向左连续
int Fun(int a,int b = 1,int c= 2);//正确,可以缺省任意数量参数,但必须有右向左连续
int Fun(int a = 1,int b,int c); //错误,不可从左向右开始缺省
int Fun(int a = 1,int b,int c = 2);//错误不可选择地缺省,必须连续从右向左缺省
2.缺省函数与重载函数不可同时出现
int Fun(int a,int b,int c = 1);
int Fun(int a,int b);
int main()
{
int ret = Fun(1,2); //会产生歧义,两个函数都可以调用,此时编译器就会报错
return 0;
}
3.缺省函数只能在声明或定义中出现一次,避免两次书写中默认值不同
2.缺省形参只能是常量或局部变量