C++学习之路-默认参数

36 篇文章 4 订阅
5 篇文章 0 订阅

一、定义-definition

函数的默认参数值,即在定义参数的时候同时给它一个初始值。在调用函数的时候,我们可以省略含有默认值的参数。也就是说,如果用户指定了参数值,则使用用户指定的值,否则使用默认参数的值。C++允许函数设置默认形式参数,在调用时可以根据情况省略实际参数。

二、默认参数使用举例-example

  • 形参全部为默认参数
int sum(int v1 = 5, int v2 = 6)
{
	return v1 + v2;
}

int main(int argc, char **argv)
{
	cout << sum() << endl;//11,默认v1=5 v2=6
	getchar();
	return 0;
}
  • 部分形参为默认参数
int sum(int v1 , int v2 = 6)
{
	return v1 + v2;
}

int main(int argc, char **argv)
{
	cout << sum(5) << endl;//11,v1传入5 默认 v2=6
	getchar();
	return 0;
}
  • 默认参数也可以是全局变量
int global_value = 20;
int sum(int v1 = 5, int v2 = global_value, int v3 = 0)
{
	return v1 + v2 + v3;
}
int main(int argc, char **argv)
{
	cout << sum() << endl;//25,默认v1=5  v2=global_value=20 v3=0
	getchar();
	return 0;
}

三、不构成默认参数的情况(易错点)-careful

默认参数只能按照右到左的顺序(因为函数调用时,实参是从左到右传)
所以函数的形参想要设置默认参数,必须保证形参列表的尾部有默认参数

  • 以下两种就是违背了 必须保证形参列表的尾部有默认参数 这一规则
int sum_1(int v1 = 5, int v2)
{
	return v1 + v2;
}
int sum_2(int v0,int v1 = 5, int v2)
{
	return v1 + v2;
}

int main(int argc, char **argv)
{
	cout << sum_1(10) << endl;//结果并不会返回15,而是报错,因为C++会认为10传给了v1
	cout << sum_1(10,20) << endl;//结果并不会返回35,而是报错,因为C++会认为10传给了v0,20传给了v1
	getchar();
	return 0;
}

四、默认参数其它常用特性

程序中如果同时有声明(.h文件)和实现(.cpp),默认参数的设定只能放在
函数声明中,即.cpp文件实现函数时,不可在形参列表里传入默认参数

.h文件
int sum(int v1 = 5, int v2 = 10);

.cpp文件-错误实现
int sum(int v1 = 5, int v2 = 10)//此处不应该再次传入默认参数
{
	return v1 + v2;
}
.cpp文件-正确实现
int sum(int v1, int v2 )
{
	return v1 + v2;
}

默认参数既可以是常量,也可以是全局’变量’,也可以是函数名

//默认参数可以是常量
int sum(int v1 = 5, int v2 = 10)
{
	return v1 + v2;
}

//默认参数可以是全局变量
int global_value = 20;
int sum_(int v1 = 5, int v2 = global_value, int v3 = 0)
{
	return v1 + v2 + v3;
}

//默认参数可以是函数名(用指针指向函数名)
void Pointer(int a)
{
	cout << "Pointer function -" <<a << endl;
}
//默认参数可以是指向函数的指针
void function_point(int v1, void(*p)(int)=Pointer)
{
	p(v1);//执行Pointer函数的功能,打印v1的值
	//void(*p)(int)=Pointer解释:int是Pointer函数形参的类型,void(*p)是函数返回值的类型
}

int main(int argc, char **argv)
{
	cout <<function_point(5) << endl;//打印Pointer function - 5
	getchar();
	return 0;
}

默认参数可以是指向函数的指针这个功能给我们的启示是:当一个函数想要在内部调用另一个函数时,就可以使用默认参数来完成

函数重载和默认参数可能会产生冲突,二义性,建议优先使用默认参数

void function1(int a, int b = 20)
{
	cout << "a is" << a << endl;
}
void function1(int a)
{
	cout << "a is" << a << endl;
}

int main(int argc, char **argv)
{
	cout <<function1(5) << endl;//会报错,C++不知道这个5是传给第一个还是第二个
	getchar();
	return 0;
}

五、默认参数的本质

虽然有默认参数,但其实还是会传参,把默认参数的值当做实参传递给形参。(都是编译器干的事)

  • 解释下方代码的本质
int sum_1(int v1 = 5, int v2 = 10)
{
	return v1 + v2;
}
int sum_2(int v1 , int v2 )
{
	return v1 + v2;
}
int main()
{
	sum_1();
	//汇编代码:
		mov edx 5
		mov edx 10
		call 0015205431032531
	sum_2(5,10);
		//汇编代码:
		mov edx 5
		mov edx 10
		call 0015205431032531
}

可以看出两个函数的汇编代码没有本质区别,只不过有默认参数的函数,编译器直接把数值传给return v1 + v2;没有默认参数的函数,先把数值传递给形参变成实参,然后函数把实参传递给return v1 + v2

六、不相关学习tips

  • 指向函数的指针写法:函数返回值(*指针名)(函数参数列表,只写类型)= 函数名
    比如:void(*pointer_)(int) = Pointer;
  • 然后就可以向指针中传参数了,进而调用指针指向的函数
    比如: (*pointer_)(5);
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值