c++函数重载的概念及原理--函数名修饰

函数重载

什么是函数重载?

重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个函数完成不同的功能。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。–百度

函数重载的概念

  • 参数个数不同
int at(int a, int b)
{
	return a+b;
}
double at(double a, double b)
{
	return a+b;
}
  • 类型不同
void at()
{
	cout << "f()" << endl;
}
void at(int a)
{
	cout << "f(int a)" << endl;
}
  • 参数顺序不同
void at(int a, char b)
{
	cout << "f(int a,char b)" << endl;
}
void at(char b, int a)
{
	cout << "f(char b, int a)" << endl;
}

使用函数重载时的注意事项

注意:
1.参数的缺省值,不构成重载

#include<iostream>
using namespace std;
int at(int a, int b)
{
	return a+b;
}
int at(int a, int b=10)
{
	return a + b;
}

在这里插入图片描述

2.构成重载,但使用时存在歧义

#include<iostream>
using namespace std;
int at()
{

}
int at(int a=10)
{
	return a ;
}

int main()
{
	at();
}

在这里插入图片描述

3.函数返回值不同不构成重载

#include<iostream>
using namespace std;
int at(int a=10)
{
	return a;
}
double at(double a=10)
{
	return a ;
}

int main()
{
	at(1);
	at(1.1);
}

为什么c++有函数重载而c语言不存在

C语言不支持函数重载的原因:两个重载函数,函数名相同,在寻找函数地址时C语言直接通过函数名来标识和查找函数地址,编译阶段, 在xxx.o符号表中存在歧义和冲突;链接阶段,也存在歧义和冲突。详情如下

1.编译时如果在当前文件有函数的定义,那么编译时就会填上函数的地址
2.如果编译时当前文件没有函数的定义,那么在编译时就没有函数的地址,在链接时会去其他xxx.o符号表根据函数修饰名字去寻找

在c++语言中,编译器会对重载函数进行函数名修饰,只要重载函数参数不同对其修饰的规则就不同,这样在编译和链接时就不会存在歧义和冲突了

在linux下实现函数重载

在linux下c语言的函数重载

gcc test.c test1.c//用C语言编译器进行编译

编译出错,c语言不支持函数重载
在这里插入图片描述

在linux下c++的函数重载实现

g++ test.c test1.c//用C++语言编译器进行编译

在这里插入图片描述

在linux下c++能实现函数重载的原因—函数名修饰

在linux下c++的函数名修饰规则:_Z+函数名长度+函数名+参数类型的首字母(例如v-void)
在这里插入图片描述

test.h

#include"test.h"                                                                                                                                                  #include<stdio.h>    
void f();                                                                                                                                                                       
void f(int a);    

test1.c

#include"test.h"           
 void f()                                                                                                                                                                  {
	printf("f()函数可以实现\n "); 
}
              
void f(int a)
{
	printf("f(int a)函数可以实现\n "); 
}
                      

test.c

#include"test.h"      
int main()      
{      
  f();      
 f(10);                                                                                                                                                                        
  return 0;      
}                


在vs2022下函数名的修饰规则

学了再来=-=

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值