函数重载与缺省参数

Posted xiao zhou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数重载与缺省参数相关的知识,希望对你有一定的参考价值。

码字不易,养成习惯,先赞后看

函数重载介绍

函数重载概念

函数重载:是函数的一种特殊情况,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.缺省形参只能是常量或局部变量

以上是关于函数重载与缺省参数的主要内容,如果未能解决你的问题,请参考以下文章

喵呜:C++基础系列:缺省函数函数重载

喵呜:C++基础系列:缺省函数函数重载

喵呜:C++基础系列:缺省函数函数重载

C++ 入门超详解!

C++ 入门超详解!

C++缺省参数 + 函数重载