目录
1. 缺省参数(默认实参)
有些函数在定义的时候,我们会给形参列表赋予一个初始值,这个初始值我们称之为缺省参数或者默认实参。而我们在调用含有缺省参数的函数时我们可以省略该实参也可以不省略,如果省略就会默认将默认实参作为自己的字面值。(缺省值必须是常量或者全局变量)
#include<iostream> using namespace std; void print(int a = 0,int b = 1) { cout << a << ' ' << b << endl; } int main() { print(); return 0; }
输出结果:
0 1
而由上我们又引出了全缺省和半缺省的概念如下。
1.1 全缺省
全缺省顾名思义就是给形参列表中的所有形参都给一个默认实参,而我们在调用的时候就可以省略实参。但是我们在省略的时候只可以从右往左依次省略避免给编译器造成歧义导致出错。
void print(int a = 1, int b = 1, int c = 1) { cout << a << ' ' << b << ' ' << c << endl; } int main() { print(0, 0, 0); print(0, 0); print(0); print(); return 0; }
1.2 半缺省
半缺省其实就是部分缺省,给部分参数赋予默认实参,但在缺省的时候要遵从一个规定便是:任意一个缺省参数的右边所有形参都必须具有默认参数。
void print(int a = 1, int b = 1, int c = 1); void print(int a, int b = 1, int c = 1); void print(int a, int b, int c = 1);
1.3 含有缺省参数的函数的声明和定义
含有缺省参数的函数在声明的时候要注意声明的时候定义和声明如果是分开的话缺省参数必须写在声明里。
void print(int a = 1, int b = 1, int c = 1); void print(int a, int b, int c){}
2. 函数重载
2.1 函数重载的判定
函数重载是C++中的一种特殊语法,即允许在同一作用域中声明几个功能类似的同名函数,这些函数的形参列表(参数个数、参数类型、类型顺序)不同,以此来处理实现功能类似但是类型不同的问题。(但需要注意函数的返回类型不作为函数重载的判定条件)
int add(int a,int b) { return a + b; } double add(double a, int b) { return a + b; } double add(int a, double b) { return a + b; }
2.2 函数重载的原理——函数名修饰规则
在我们程序的链接阶段,链接器会对函数进行寻址,但是重载的函数函数名都相同,链接器无法知道调用的是哪个函数,所以编译器会对重载的函数进行函数名修饰,而不同编译器的函数名修饰规则都不相同,windows下vs的函数名修饰规则较为复杂且不容易理解,而Linux下的函数名修饰规则(_Z+函数名长度+函数名+形参类型首字母)相对简单易懂,所以我会以Linux为例来给大家讲解。
编辑
仔细对比上图我们就可以看到,在Linux下gcc对重载的函数进行了函数名修饰,将函数参数的类型信息添加到了修改后的名字中,call指令也会按照修饰后的函数名称进行寻址。