C++:函数重载
自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了,函数重载就相当于是定义了同名的函数,且仅限于名字相同
文章目录
前言
一、什么是函数重载?
1.1参数的数量不同
1.2参数的类型不同
1.3参数的顺序不同
1.4 重载的条件
二、为什么有函数重载
2.1直观的命名表达不同功能
2.2为什么C语言中不支持重载,但是C加加中支持
总结
前言
”重载“ 是一种允许使用相同名称的函数或操作符,但它们的参数列表或返回类型不同,以实现不同功能的机制。以下是关于 C++ 函数重载的详解:
一、什么是函数重载?
函数重载定义 :在同一个作用域内,允许定义多个同名函数,这些函数的参数列表不同,即参数的数量、类型或顺序不完全相同,但函数名相同。就好比在公司里,不同职位的人有可能会重名,但公司里的人或同事可以根据他的职位和部门来区分。
1.1参数的数量不同
#include<iostream>
using namespace std;
void add(int a, int b)
{cout << a + b << endl;
}
void add(int a,int b,int c)
{cout << a + b + c<< endl;
}
int main()
{add(1, 2);add(1,2,3);return 0;
}
1.2参数的类型不同
#include<iostream>
using namespace std;
void add(int a, int b)
{cout << a + b << endl;
}
void add(double a, double b)
{cout << a + b << endl;
}
int main()
{add(1, 2);add(1.1, 2.2);return 0;
}
1.3参数的顺序不同
#include<iostream>
using namespace std;
void add(int a, int b)
{cout << a + b << endl;
}
void add(int a, double b)
{cout << a + b << endl;
}
int main()
{add(1, 2);add(1, 2.2);return 0;
}
1.4 重载的条件
函数名相同,参数列表不同,返回值类型可以相同也可以不同,但不能仅以返回值类型不同来重载函数。
#include<iostream>
using namespace std;
void add(int a, int b)
{cout << a + b << endl;
}
int add(int a,int b)
{return a+b
}
int main()
{add(1, 2);add(1, 2);return 0;
}
这样的是不构成重载的:
说白了就是函数名或参数一定要有一个不同,参数的不同,不同在个数以及类型以及类型的顺序
二、为什么有函数重载
2.1直观的命名表达不同功能
在设计函数时,有些函数功能类似,如果没有重载的话,就可能需要给不同类型的函数取不同的名字,但是他们的功能都是相似的,比如说,都是加法函数我浮点型相加,要写成整型相加,要写成,而有了重载之后,我们可以使用同一个函数名,"add",让代码变得更加的清晰,让别人看到函数就知道它的功能是什么,提高了代码的可读性
C语言中是判断不了调用哪个函数,但是C++中可以支持这种操作,它会根据传入的参数类型自动匹配所对应的函数
2.2为什么C语言中不支持重载,但是C加加中支持
C:
#include<stdio.h>
void add(int a, int b)
{printf("%d\n", a + b);
}
void add(double a, double b)
{printf("%lf\n", a + b);
}
int main()
{add(1, 2);add(1.1, 2.2);return 0;
}
C++:
C语言不支持函数重载的原因之一:
C语言的函数调用约定是基于函数名的。在编译时,C语言的编译器会根据函数名生成对应的符号(symbol),而不会根据参数类型或数量进行区分。例如,对于函数 void add(int a,int b) 和 void add(double a,double,b) ,如果C语言支持重载,那么编译器在生成符号时会面临冲突,因为它们的函数名相同。C语言的编译器和链接器无法区分同名但参数不同的函数,因此无法实现函数重载。
C++支持函数重载的原因之一:
C++通过名称修饰(也称为名称修饰符或名称修饰规则)解决了函数重载的符号冲突问题。名称修饰是一种将函数名、参数类型、返回类型等信息编码到符号名称中的机制。例如,对于函数 void add(int) ,C++编译器可能会生成一个符号如 _Z3fooi ,而对于 void add(float) ,可能会生成 _Z3foof 。通过这种方式,C++编译器和链接器可以区分同名但参数不同的函数,从而支持函数重载。
总结
首先,这篇文章一开始从函数重载的定义入手,从三个方面讲解重载的条件,以及给出了反面例子,其次又说明了为什么有函数重载,并且附加了为什么C语言不支持重载函数,但是C++支持重载函数