C++57个入门知识点_12 函数重载及其条件(函数重载:同一作用域中有多个同名函数、条件:(1)函数名相同(2)参数个数不同、类型不同、顺序不同(3)返回值和调用约定不考虑(4)作用域相同)

本篇将主要介绍C++中的函数重载定义及条件,所谓的函数重载即同一作用域中可以有多个同名函数,调用时按照参数调用

总结:
1.函数重载的定义:同一作用域中可以有多个同名函数,调用时按照参数调用。
2.函数重载的条件:

  • 函数名必须相同
  • 函数参数个数不同、类型不同、顺序不同
  • 函数返回值不做考虑、_stdcall/_cdecl等调用约定不做考虑
  • 作用域相同

1.C语言中实现多类型参数的函数调用

首先看一段C中利用宏实现值的大小比较的代码:

#include <iostream>

//利用宏来比较两个数的大小
//由于宏不检查数据类型,对于任意数据类型都是可以用来比较的
//但就是因为不检查数据类型检查,可能出现问题,因此不建议用来表示函数
#define GETMAX(a,b) ((a)>(b))? (a):(b);

int main(int argc, char* argv[])
{
	int n = GETMAX(1,2);
	return 0;
}

运行结果:
在这里插入图片描述
当main中改为:int n = GETMAX(1.0f,2.0f);返回值一样。

由于宏不检查数据类型,对于任意数据类型都是可以用来比较的,但就是因为不检查数据类型检查,可能出现问题,因此不建议用来表示函数

2.C++中函数重载的定义

为了解决宏不能进行类型检查问题,我们可以使用函数来设置数据类型,但是一旦限制数据类型,一个函数就对应一种情况。
为了应对不同数据类型的情况,我们可能就需要写多个函数,如果都使用一个函数名,但是数据类型的不同这样可以吗?

以下代码:其中有2个gexMax同名的函数,参数对应的数据类型不同

#include <iostream>

//利用宏来比较两个数的大小
#define GETMAX(a,b) ((a)>(b))? (a):(b);

int gexMax(int a, int b) {

	return ((a) > (b)) ? (a) : (b);
}

char* gexMax(char* a, char* b) {

	return ((a) > (b)) ? (a) : (b);
}

int main(int argc, char* argv[])
{

	int n = GETMAX(1,2);

	return 0;
}

C中肯定是不可以的,可以通过将后缀.CPP改为.C编译查看,结果如下:显示函数重定义
在这里插入图片描述
而在C++中是可以编译通过的,这就说明C++中有一种新的语法再支持多个同名函数的情况,这种语法就成为函数重载。

函数重载的定义:C++中允许出现同名的函数

3.函数重载的条件

谈到函数,我们需要知道函数的要素包括:函数名,函数参数,函数返回值,函数的调用约定。同样的谈到重载也需要从这几个方面考虑。

当函数一模一样的时候,编译是否可以通过呢?有如下代码:

#include <iostream>

int gexMax(int a, int b) {

	return ((a) > (b)) ? (a) : (b);

}

int gexMax(int a, int b) {

	return ((a) > (b)) ? (a) : (b);

}

运行结果:显示已经有主体,函数一模一样是不行的
在这里插入图片描述

3.1 函数名必须相同

3.2 函数参数个数不同、类型不同、顺序不同

以下代码包含了函数参数个数不同、类型不同、顺序不同,可以正常编译

#include <iostream>

int gexMax(int a, float b) {

	return ((a) > (b)) ? (a) : (b);

}

int gexMax(float a, int b,int c) {

	return ((a) > (b)) ? (a) : (b);

}

3.3 函数返回值不做考虑、_stdcall/_cdecl等调用约定不做考虑

  • 当返回值不同时,不会构成重载
#include <iostream>

float gexMax(int a, float b) {

	return ((a) > (b)) ? (a) : (b);

}

int gexMax(int a, float b) {

	return ((a) > (b)) ? (a) : (b);

}

运行结果:
在这里插入图片描述

  • 当调用约定不同时,不会构成函数重载
int _stdcall gexMax(int a, int b) {

	return ((a) > (b)) ? (a) : (b);

}

int _cdecl gexMax(int a, int b) {

	return ((a) > (b)) ? (a) : (b);

}

运行结果:
在这里插入图片描述

3.4 作用域相同

当函数不在一个作用域时,是不会检查函数重载的

float gexMax(int a, float b) {

	return ((a) > (b)) ? (a) : (b);

}

namespace ShieldMad {

	int gexMax(int a, float b) {

		return ((a) > (b)) ? (a) : (b);

	}

}

运行结果:不会构成重载

4.学习视频地址:C++57个入门知识点_12 函数重载及其条件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十月旧城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值