【C++】缺省参数和函数重载

 

目录

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,欢迎一起交流学习。

  • 13
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值