C++函数重载

在C语言中,当我们要实现功能相同,但有不同类型的函数时,我们往往要写好几个函数,用不同函数名加以区分。例如,当我们要实现不同类型的两个数交换的函数时:

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

但在C++中,有了函数重载来解决这种功能类似但数据类型不同的问题。
一、函数重载是什么?
1.概念:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,但这些同名函数的形参列表(参数个数、类型、类型的顺序)必须不同。

#include <iostream>
using namespace std;
int Sub(int left,int right)
{
return left-right;
}
double Sub(double left,double right)
{
return left-right;
}
int main()
{
Sub(20,10);
Sub(34.5,12.4);
return 0;
}

2.形参列表不同的体现:
(1)参数个数不同

void Fun();
void Fun(int a);
void Fun(int a, int b);

(2)参数类型不同

void Fun(int a,int b);
void Fun(double a,int b);
void Fun(double a,double b);

(3)参数类型的顺序不同

void Fun(int a,char b);
void Fun(char a,int b);

3.注意:当只有函数的返回值类型不同时,不构成函数重载,函数的重载和返回值类型无关
4.怎样判断其为函数重载:
(1)同一作用域
(2)函数名相同
(3)形参列表不同(参数个数、类型、类型的顺序)
二、函数重载的调用原理

1.函数重载是在编译器阶段具体来确定调用哪个函数的。
2.编译器在编译阶段会对函数实参类型进行推演,根据推演的实际结果找类型匹配的函数进行调用。
如果存在类型完全匹配的函数,则直接调用;反之,则会进行隐式类型转换,如果隐式类型转换后有对应的函数则进行调用,没有则会报错。

#include <iostream>
using namespace std;
int Sub(int left,int right)
{
return left-right;
}
double Sub(double left,double right)
{
return left-right;
}
int main()
{
//char类型和int类型可以发生隐式转换,最终调用的是 int Sub(int left,int right)
Sub('4','1');
//编译器需寻找 Sub(char *,char *),但是没有找到,也没有发生隐式转换,因此会报错
Sub("3","2");
//编译器在编译阶段对其形参类型进行推演:int double
//则寻找Sub(int,double),未找到
//但int和double之间可以发生隐式转换,则有两种方式:int-->double double--->int 
//此时编译器不知道该选择那种方式进行转换,故会编译报错
Sub(10,3.4);
return 0;
}

三、为什么C++支持函数重载,而C语言不支持函数重载?
1.在C语言中,编译器在编译.c文件时,只会给函数进行简单的重命名,具体的方法是在函数名前加“_”,所以当两个函数的函数名相同时,其编译之后的函数名也想同,因此调用者会不知道调用哪个而出错。

在这里插入图片描述2.在C++中,编译器在编译.cpp文件时,重命名是有规则的,其中,“ ?”表示开始,“ ?”后面为函数名,“@@YA”表示参数开始,后面的是三个字符分别表示:返回值类型、两个参数类型,“@Z”表示名称结束。因此当两个函数的名称相同时,参数列表不同时,两个函数生成的符号表中的名称不一样,所以编译通过。

在这里插入图片描述
四、exctern “C”
1.extern修饰符可用于指示C或C++函数的调用规范,因为C++和C程序编译完成后在目标代码中命名规则不同。
2.如果想在C++中将一些函数按照C语言的风格来进行编写,则需要在函数前加exctern “C”,其意思是告诉编译器,将函数按照C语言规则来编写。当你用C++写了一个项目,但是用C语言的方式运行,则可以使用extern "C"来解决。
3.注意:extern “C” 不会对函数体内容按照C的方式进行编写,其只是对函数的调用按照C的形式。

#include <iostream>
using namespace std;
extern "C" int Sub(int left, int right)
{
	return left - right;
}
int main()
{
Sub(16,10);
return 0;
}

此时你会发现编译器在编译.cpp文件时,函数名重命名为_Sub(),其按照C语言的重命名方式。
4.如果在C++中有多个函数需要按照C语言的风格来进行编写,则:

#include <iostream>
using namespace std;
extern "C"{
int Sub1(int left,int right);
int Sub2(int left,int right);
}
int Sub1(int left, int right)
{
	return left - right;
}
int Sub2(int left, int right)
{
	return left - right;
}
int main()
{
Sub1(10,20);
Sub2(30,10);
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值