C++:函数重载的详解看这里

函数重载

在我们平时写代码的过程中,会遇到这样一种情况,写的函数实现功能相同,但部分细节却有不同,比如:交换两个数的值其中包括(int, float,char,double)这些类型。我们在C语言中采取如下的方式进行编写:(采用不同的函数名称)

void Swap1(int *a, int *b);
void Swap2(double *a, double *b);
void Swap3(char *a, char *b);
void Swap4(float *a, float *b);

我们会发现这样的编写方式给程序员们带来了很多的不便,所以在C++中,我们有了更为简单快捷的方式-----函数重载。

概念

函数重载是一种特殊的函数情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数、类型、顺序)必须不同,常用来处理实现功能类似数据类型不同的问题

函数重载的规则

  • 函数名称必须相同
  • 函数的参数列表(参数个数、类型、顺序)必须不同
  • 返回类型可以相同也可以不同
  • 仅仅只是返回值类型不同是不能构成函数的重载
  • 函数重载在调用时调用哪一个函数是编译器在编译阶段确定的
#include <iostream>
#include <Windows.h>
using namespace std;

int Add(int a, int b)
{
	return a + b;
}

double Add(double a, double b)
{
	return a + b;
}

float Add(float a, float b)
{
	return a + b;
}

int main()
{
	cout << Add(1, 2) << endl;
	cout << Add(1.0, 2.5) << endl;
	cout << Add(1.1, 1.2) << endl;

	system("pause");
	return 0;
}

函数重载的作用

函数重载通常用来在同一个作用域内,功能相似的函数,这样减少了函数名的数量,避免了名字空间的污染,也提高了程序的可读性,函数的易用性。并且运算符的重载本质就是函数重载。

函数重载的实现----通过名字修饰
1.什么是名字修饰?
在C/C++中,一个程序运行起来,需要经历以下四个阶段(预处理、编译、汇编、链接),名字修饰是在编译过程将函数、变量名称重新改编的过程。简单来说就是编译器为了区分各个函数,将函数通过一定的方式重新修饰为一个全局唯一的名称。
2、C语言的名字修饰
C语言的名字修饰非常简单,只是在函数名字前面添加了下划线。
比如,对于以下代码,在最后链接时就会出错:(在VS2013 C语言编译器编译)

int Add(int i, int j);
int main()
{
	Add(6, 8);
	return 0;
}

在这里插入图片描述
说明:
Add函数中只给了函数的声明没有进行定义,在函数进行链接时会进行报错,从报错结果中看,函数在C语言编译器采用在函数名前加下划线的方式作为编译后的名字,所以当创建的工程中存在相同函数名的函数就会进行报错。
而在C++中:
在这里插入图片描述
我们会发现编译器不再只是对它做简单的下划线处理,而是更加复杂的修饰方式:函数的名字和参数类型。
所以,这就是为什么在函数重载中要求函数参数列表不同,因为编译器在编译时会对函数名字进行重新修饰,将参数类型包含在最终的名字中,这样就可以保证函数名字在底层的全局唯一性。

函数修饰后的名称
int func(int)?func@@YAHH@Z
float func(float)?func@@YAMH@Z
int C::func(int)?func@C@@AAEHH@Z
int C::C2::func(int)?func@C2@C@@AAEHH@Z
int N::func(int)?func@N@@YAHH@Z
int N::C::func(int)?func@C@N@@AAEHH@Z

函数重载调用过程

在编译阶段,编译器会对传递的实参类型进行推演,根据推演的结果选择合适的函数进行调用,若推演后没有合适的函数可以调用,编译器则会尝试进行参数隐式类型转化,转化完成此时会出现两种情况,有合适的函数进行调用则编译成功,无合适的函数调用则编译失败。(其中char和int可以发生隐式类型转化,int和double编译器会直接进行报错)
extern “C”
当我么需要将某些函数按照C语言的风格进行编译时,在函数前加extern “C”,该函数则会根据C语言的规则进行编译

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值