目录
C++支持函数重载的原理--名字修饰(name Mangling)
前言
前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的命名空间的一些知识点,也相信大家都掌握的不错,接下来博主将会带领大家继续学习有关C++的知识点——缺省参数、函数重载。下面话不多说坐稳扶好咱们要开车了。
一、缺省参数
1.缺省参数的概念
所谓缺省参数,顾名思义,就是在声明函数的某个参数的时候为之指定一个默认值,在调用该函数的时候如果采用该默认值,你就无须指定该参数。 缺省参数使用主要规则:调用时你只能从最后一个参数开始进行省略,换句话说,如果你要省略一个参数,你必须省略它后面所有的参数,即: 带缺省值的参数必须放在参数表的最后面。
例如:
void Func(int a = 0) { cout<<a<<endl; } int main() { Func(); // 没有传参时,使用参数的默认值 Func(10); // 传参时,使用指定的实参 return 0; }
2.缺省参数分类
⭕全缺省参数
也就是全部缺省的函数,都有初始化的值,例如:
void Func(int a = 10, int b = 20, int c = 30) { cout<<"a = "<<a<<endl; cout<<"b = "<<b<<endl; cout<<"c = "<<c<<endl; }
⭕半缺省参数
也就是部分缺省的函数,部分有初始化的值,例如:
void Func(int a, int b = 10, int c = 20) { cout<<"a = "<<a<<endl; cout<<"b = "<<b<<endl; cout<<"c = "<<c<<endl; }
需要注意的有四点:
🔴半缺省参数必须从右往左依次来给出,不能间隔着给
🔴缺省参数不能在函数声明和定义中同时出现
🔴缺省值必须是常量或者全局变量
🔴C语言不支持(编译器不支持)
//a.h void Func(int a = 10); // a.cpp void Func(int a = 20) {...} // 注意:如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值。
二、函数重载
1.函数重载的概念
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数或类型或类型顺序)不同,常用来处理实现功能类似数据类型
不同的问题。
2.函数重载类型
🔴参数类型不同
#include<iostream> using namespace std; // 1、参数类型不同 int Add(int left, int right) { cout << "int Add(int left, int right)" << endl; return left + right; } double Add(double left, double right) { cout << "double Add(double left, double right)" << endl; return left + right; }
🔴参数个数不同
// 2、参数个数不同 void f() { cout << "f()" << endl; } void f(int a) { cout << "f(int a)" << endl; }
🔴参数类型顺序不同
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; }
C++支持函数重载的原理--名字修饰(name Mangling)
想必你的内心肯定有这样的疑问为什么C++支持函数重载,而C语言不支持函数重载呢?
接下来我们来分析一下,首先在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接。
编辑
编辑
通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办法区分。
参数匹配
编译器根据当前范围内的函数声明与函数调用中提供的参数的最佳匹配,来选择要调用的重载函数。 如果找到合适的函数,则调用该函数。 (步骤如下)
🔴找到完全匹配项。
🔴已执行不重要的转换。
🔴已执行整型提升。
🔴已存在到所需自变量类型的标准转换。
🔴已存在到所需参数类型的用户定义转换(转换运算符或构造函数)。
🔴已找到省略号所表示的自变量。
编译器为每个自变量创建一组候选函数。 候选函数是这样一种函数,其中的实际自变量可以转换为形式自变量的类型。为每个自变量生成一组“最佳匹配函数”,并且所选函数是所有集的交集。 如果交集包含多个函数,则重载是不明确的并会生成错误。 对于至少一个参数而言,最终选择的函数始终比组中的所有其他函数更匹配。 如果没有明显的优胜者,函数调用会生成编译器错误。