👉函数重载👈
自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!”
函数重载概念
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数或类型或类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。
参数类型不同
#include <iostream> using namespace std; int Add(int left, int right) { return left + right; } double Add(double left, double right) { return left + right; } int main() { cout << Add(1, 2) << endl; cout << Add(1.1, 2.2) << endl; return 0; }
这也是 C++ 相较于 C语言的优势,其实就是编译器能够自动识别类型,本质就是函数重载支持。
个数不同
#include <iostream> using namespace std; void f() { cout << "f()" << endl; } void f(int a) { cout << "f(int a)" << endl; } int main() { f(); f(1); return 0; }
顺序不同
#include <iostream> using namespace std; void f(int a, char b) { cout << "f(int a,char b)" << endl; } void f(char b, int a) { cout << "f(char b, int a)" << endl; } int main() { f(0, 'A'); f('A', 0); return 0; }
注意:顺序不同是形参类型顺序不同,以下的代码不是顺序不同,并不构成函数重载。
void f(int b, int a) { cout << "f(int b, int a)" << endl; } void f(int a, int b) { cout << "f(int a, int b)" << endl; }
含数重载与缺省参数
#include <iostream> using namespace std; // 构成函数重载 void f() { cout << "f()" << endl; } void f(int a = 0, char b = 1) { cout << "f(int a, char b)" << endl; } int main() { f(10); f(10, 20); return 0; }
注意:以上的函数构成函数重载,但是调用f()
会报错,存在歧义。
C++支持函数重载的原理
为什么C++支持函数重载,而C语言不支持函数重载呢?
在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接。C /C++在编译链接的时候,会生成符号表。不过 C语言 和 C++ 生成的符号表是不一样的。C语言的符号表直接是函数名+地址,而 C++ 的符号表是经过修饰后的函数名+地址。所以 C语言不会支持同名函数,也就是不支持函数重载,而 C++是支持函数重载的。
结论:在 linux 下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参数类型信息添加到修改后的名字中。
通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。而不同的编译器下,函数名的修饰规则可能会不一样。
Windows下名字修饰规则
对比Linux会发现,windows下vs编译器对函数名字修饰规则相对复杂难懂,但道理都是类似的,我们就不做细致的研究了。
相信大家都知道函数名修饰规则,那我问大家一个问题:. 如果两个函数函数名和参数是一样的,返回值不同是否构成函数重载。相信很多同学可能会说构成函数重载,因为我们只需要在函数名前面加上函数的返回值类型标识就好了。其实这不是真正的原因,就算函数名修饰时加上函数的返回值类型也会出现问题,因为在调用函数的时候没有办法指定函数的返回值类型。
函数名和参数是一样的,返回值不同的函数不构成重载的真正原因并不是函数名修饰规则,而是调用时的二义性,调用时不指定函数的返回值类型,无法区分调用哪一个函数。
👉总结👈
在本篇博客里,我们学习了C++的命名空间、输入和输出、缺省参数以及函数重载。这也意味着我们已经步入了C++,希望我们一起努力吃透C++。以上就是本篇博客的全部内容了,如果大家觉得有收获的话,可以点个三连支持一下!谢谢大家啦!💖💝❣️