函数重载
什么是函数重载?
重载函数是函数的一种特殊情况,为方便使用,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下函数名的修饰规则
学了再来=-=