函数重载与缺省值

什么是函数重载?

在相同的声明域中的函数名相同的,而参数表不同的,即通过函数的参数表而唯一标识并且来区分函数的一种特殊的函数。

何时选择函数重载?

当将要定义一组函数,使它们执行一系列的操作,但是它们是应用在不同的参数类型上的。此时我们可以选择重载函数。

代码分析:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<Windows.h>
using namespace std;
void Swap(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}
void Swap(char* a, char* b)
{
	char tmp = *a;
	*a = *b;
	*b = tmp;
}
void Swap(float* a, float* b)
{
	float tmp = *a;
	*a = *b;
	*b = tmp;
}
int main()
{
	int x = 10;//整型
	int y = 20;
	cout << x << "," << y << endl;
	Swap(&x, &y);//交换函数注意传的是地址
	cout <<x<< ","<<y<< endl;

	char x1='a';//字符类型
	char y1='b';
	cout << x1 << "," << y1 << endl;
	Swap(&x1,&y1);
	cout << x1 << "," << y1 << endl;

	float x2 = 4.2;//浮点型
	float y2 = 2.4;
	cout << x2 << "," << y2 << endl;
	Swap(&x2, &y2);
	cout << x2 << "," << y2 << endl;
	system("pause");
	return 0;
}


那么函数重载是如何选择函数的呢?

这里大致分为三步

第一步:确定该调用中所考虑的重载函数的集合,该函数集合被称为候选函数。所谓候选函数就是与被调用函数同名的函数。

第二步:选出的候选函数中调出可行函数。可行函数的函数参数个数与调用的函数参数个数相同,要是可行函数的参数多,则多出来的函数参数都要有相关的 缺省值 。然后再根据参数类型的转换规则将被调用的函数 实参 转换成候选函数的实参。

void add(int);//可行
void add(double, double x = 1.0);//可行
void add(int, int);//没有缺省值
void add(double, double);//同上
int main()
{
	add(4.2);
	return 0;
}

如果依照参数转换规则没有找到可行函数,则该调用就是错误的。

第三步:从第二步中选出的可行函数中选出最佳可行函数。在最佳可行函数的选择中,从函数 实参 类型到相应可行函数参数所用的转化都要划分等级,根据等级的划分,最后选出最佳可行函数。

如果看的到.map文件里面,你会发现函数在编译之后发生了重命名

类似于  ?ADD@@YAHHH@Z    

其中 ?代表开始 ADD是函数名,@@YA代表参数开始  第一个H代表返回值类型int 剩下的代表参数int int.  @Z代表结束

而言之,判断一组同名函数能否构成重载,要看能不能通过修改形参来影响实参的值,如果两个函数实参的值都能被修改或都不能被修改,则不能构成重载;否则构成重载。

 

缺省参数:

 

缺省参数,顾名思义,就是在声明函数的某个参数的时候为之指定一个默认值
举个代码:
#include <iostream>  
#include<Windows.h>
using namespace std;
void func(int a, int b = 3, int c = 1)//三个参数,后两个缺省
{
	cout << a << "," << b << "," << c << endl;
}
int main()
{
	func(10);
	func(10, 20);
	func(10, 20, 30);
	system("pause");
	return 0;
}

看上面相信大家应该清楚缺省的调用了吧。
需要注意的几点:

1.缺省值必须为常量,也可以是全局变量

2.缺省参数只能同时在函数声明与函数定义的一方

3.只能从最后一个参数开始进行省略,就是说,你要省略一个参数,就必须把从它开始到后面的参数都要缺省。

4 .如果函数传参,则调用参数;没传则调用缺省值

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值