目录
1.缺省参数
1.1缺省参数的定义
1.2 缺省参数的简单应用
1.3 缺省参数分类:全缺省参数和半缺省参数
1.3.1半缺省参数
1.3.2全缺省参数
3.缺省参数注意事项:缺省参数不能在函数声明和定义中同时出现
4.函数重载
4.1 函数重载概念
4.2 函数参数类型不同的函数重载
4.3函数参数个数不同的函数重载
4.4 顺序不同也可以归类为类型不同
5.c++支持函数重载/c语言不支持函数重载的原因
1.缺省参数
1.1缺省参数的定义
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实 参则采用该形参的缺省值,否则使用指定的实参。
void Print(int x = 8)
{
cout << x << endl;
}
这里的x就是一个缺省参数,如果我们调用这个函数的时候我们给函数传入参数,则使用的是我们传入的参数,如果我们调用这个函数不给这个函数传入参数,则某认使用缺省参数的值。
1.2 缺省参数的简单应用
在我们写栈的初始化或者顺序表的初始化的时候,如果我们知道要开多大的空间,我们可以直接给函数传入空间大小的值,如果不知道的情况下,我们可以利用缺省参数固定开多少空间。使得函数参数调用非常灵活。
void Func(int a = 10, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
int main()
{
Func();
Func(1);
Func(1,2);
Func(1,2,3);
return 0;
}
1.3 缺省参数分类:全缺省参数和半缺省参数
1.3.1半缺省参数
参数缺省部分
特点:缺省值只能从右往左给,必须是连续的。
这两种方式都是错误的,因为函数调用传参的时候会有争议。
1.3.2全缺省参数
函数的所有参数都设置缺省值
void Func(int a = 10, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
int main()
{
Func();
Func(1);
Func(1,2);
Func(1,2,3);
return 0;
}
全缺省参数不可以之传递中间的某一个或者某几个值。不要间隔着传
3.缺省参数注意事项:缺省参数不能在函数声明和定义中同时出现
因为害怕函数声明的时候是一个参数值,函数定义的时候又是一个参数值,没有办法有一个标准
但是也不能定义是缺省参数,函数声明没有, 所以如果声明和定义分离,只能在声明地方给缺省参数。因为有些地方只用到函数的声明,所以以声明为主,然后定义可以不用给。
缺省值一般是常量或者全局变量,但是一般是变量 ,c语言不支持缺省。
4.函数重载
在汉语或者自然语义中,一个词通常有多个意义,人们可以根据不同的环境和语态来理解一个词的不同意思比如:卧槽,那么我们就说这个词被重(chong)载了.
4.1 函数重载概念
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型 不同的问题。
也就是说函数名可以相同但是参数不同(参数的个数,类型,顺序不同)但是对返回值没有要求(可同可不同)
4.2 函数参数类型不同的函数重载
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;
}
int main()
{
Add(10, 20);
Add(10.1, 20.2);
return 0;
}
看着是两个相同的函数,但是编译器会去匹配,C语言不可以这样写
如果我们使用:Add(1,2.2)这样的方式传参,编译会报错,因为我们知道整型和浮点型之间是会有隐式类型转换的,对于两个参数来说到底是double转int还是int 转double是有争议的,所以编译不过,
但是我们要是屏蔽其中一个函数就可以编译通过:
因为此时就没有争议了。
4.3函数参数个数不同的函数重载
// 2、参数个数不同
void f()
{
cout << "f()" << endl;
}
void f(int a)
{
cout << "f(int a)" << endl;
}
int main()
{
/*Add(10, 20);
Add(10.1, 20.2);
*/
f();
f(10);
return 0;
}
函数重载和缺省参数
缺省参数的有和没有不影响两个同名函数构成函数重载,因为属于参数个数不同的类型,但是在调用这两个函数的时候,不传参数的情况下就有歧义
4.4 顺序不同也可以归类为类型不同
// 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;
}
为什么不能是返回值不同:
返回值不同不能够构成区分函数的条件,存在调用歧义。
5.c++支持函数重载/c语言不支持函数重载的原因
多文件编译的时候是需要使用函数名去寻找函数地址的,因为只有函数声明,同名函数要得以区分就要用函数名修饰规则。
在代码编译运行的过程中,在编译阶段会形成符号汇总,这时候的函数声明等没有具体的地址,具体的地址是函数实现的地址,但是编译器会让通过,就像打了一个欠条,在汇编的时候形成符号表,这个时候将函数名和地址合在一起,形完整的符号表,后续调用这个函数,就可以call这个函数的地址。C语言不存在同名函数,链接函数时就用函数名去找。
但是c++中 存在同名函数,寻找函数地址时就不以函数去找,不同编译器下的解决方案不同,在在linux下:
linux下函数名修饰规则:call函数的时候使用这样的地址去找这个函数,类型不同修饰的函数就不同,得以区分同名函数)
_Z是前缀 +函数名的字符个数+函数名+参数的首字母
gcc编译c语言代码:使用函数名寻找
g++编译,:使用修饰过后的函数名去寻找,区分了同名函数。
不同的编译器区分规则是不一样的,linx下更直观一些。
6.结语
上述就是今天分享的内容,如果大家觉得有用,创作不易,希望收获三连。我是Nicn,欢迎一起交流学习。