前言:续接前文的总结。
1.缺省参数
这东西相信我们都不是陌生,这个会在你最需要它的时候的出现,在你不需要它的时候它会默默的等待着你需要它;但你却只是在需要它的时候才会搭理他。这个就是大名鼎鼎的备胎。那么它和我们这个缺省参数有何关系呢?我来回答你,缺省参数就可以看作一个备胎。
(1)缺省参数的定义:
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参,则采用该形参的缺省值,否则使用指定的实参。
可能定义读起来有点晦涩难懂,那么我们来画一画图吧!
(2)缺省参数的分类:
1.全缺省参数
void Func(int a = 10, int b = 20, int c = 30)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
2.半缺省参数
void Func(int a, int b = 10, int c = 20)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
半缺省参数有几个要注意的地方:半缺省参数必须要从右往左定义,不能间隔着定义
缺省参数不能在声明和定义中同时出现,编译器不知道要去找那个。
缺省参数必须是常量或全局变量
2.函数重载
(1)定义:函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题(简单来讲就是函数名相同,函数参数不同;函数参数不同包含函数的参数类型/参数的个数/参数的顺序)
// 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;
}
void f(int a)
{
cout << "f(int a)" << endl;
}
//2、参数个数不同
void f()
{
cout << "f()" << endl;
}
void f(int a,int b)
{
cout << "f()" << endl;
}
//3、参数类型顺序不同
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;
}
以上是简单的例子
(2)C++为什么会能够支持函数的重载
我们知道一个程序文件需要变成可执行程序,是需要经过预处理生成.o文件再经过编译生成.i文件然后再经过汇编 生成.o文件,最后通过链接生成可执行的程序,在汇编完成后会生成一个符号表,在链接的时候函数的调用会去符号表中寻找相对于函数调用的函数名。
我们先来看看C语言Linux下gcc编译器的编译情况
C语言在gcc编译器下编译完后函数的函数名修饰并没有改变,这也导致了C语言无法实现函数的重载。
我们再来看看C++在Linux下g++编译器的编译情况
在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参
数类型信息添加到修改后的名字中。
所以C++函数我们写的时候虽然同名,但由于参数不同,在程序进行编译时会自动根据函数参数类型进行修饰函数名,从而在链接时会在符号表能够找到对应的函数。