【C++】缺省参数

其实在C++基础一文中已经介绍过了缺省参数,但是每次用这玩意都是很迷,今天趁着复习c++知识,再来总结一下缺省参数。

🌈1.缺省参数知识图:

 看来看去也就这么多的知识点,接下来就一一介绍一下:

🍄1.1缺省参数的概念:

缺省参数:是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参 。

不就是备胎吗,无人可用了用备胎。

#include<iostream>
using namespace std;
void testFunc(int a = 0)
{
	cout << "a:" << a << endl;
}

int main()
{
	testFunc();//没有指定实参,使用缺省值(用备胎)
	testFunc(10);//指定实参,使用实参
	return 0;
}
  •  那啥是缺省值?

int a=0 中 0就是缺省值,为啥叫缺省值呢?本来主函数应该传递实参给功能函数,但是这小子它缺工减料,它不传,那形参是不是必须找备胎了,要不没法玩,这个备胎就是可以缺省的,下次如果传实参,备胎就上一边去了,所以把这个备胎就做缺省值。

🍄1.2缺省参数对于实形参个数不同的作用 

  • 在处理这个问题之前我还有一个疑问, 在座的各位知不知道啥是实参,形参?

我在这也不在絮百度上的概念了,在main()主函数中,要调用功能函数,往功能函数中传入的参数就是实参(10),而功能函数testFunc()必须要找一个参数来接收主函数传来的实参,而接收的这个东西就叫形参。

同志们,如果说现在咱们还是二年级小可爱,老师给我们留了一个4个数相加 的作业,但是呢,每一次就其中的唯一一个数变化,那我们还要每次都把其他三个数再算一次吗?此时我们只需要每次改变那一个数就行了。

void testFunc2(int a, int b=50, int c=60, int d=70)
{
	cout << "Sum=" << a + b + c + d << endl;
}
int main()
{
	testFunc2(40);//没有指定实参,使用缺省值(用备胎)
	return 0;
}

也就是说只要每次改变a的值就行了。

  • 缺省参数的函数调用:

缺省实参并不一定是常量表达式,可以是任意表达式,甚至可以通过函数调用给出。如果缺省实参是任意表达式,则函数每次被调用时该表达式被重新求值。但表达式必须有意义

void testFunc3(int a, int b = int{}, int c = int(), int d = 70)
{
	cout << "a:" << a << endl;  //40
	cout << "b:" << b << endl;  //0
	cout << "c:" << c << endl;  // 0
	cout << "d:" << d << endl;  //70
	cout << "Sum=" << a + b + c + d << endl;   //10
}

至于为啥int b=int{},int c=int()的缺省值为啥是0,这个不用知道也没啥问题。

🌈 2.缺省参数的分类

🍄2.1全缺省参数 

同志们,之所以都迷缺省参数到底是缺那里,估计是缺省参数这个名字误导了咱们,大致是不是认为缺省值是不给形参备胎,别人有,它没有就是缺省。如今看来那是方向都错了。 以后把这个名字补全。

  • 全缺省值参数(每一个形参都有缺省值(备胎))

全缺省参数并不仅仅是主函数中一个实参都不传,而是每一个形参都有缺省值。实参要是相传也可以传。

void testFunc4(int a=200, int b = 50, int c = 60, int d = 70)
{
	cout << "Sum=" << a - b - c - d << endl; 
}
int main()
{
	testFunc4();//一个实参不传   //20
	return 0;
}
  • 实参也可以任意数量传入:
void testFunc4(int a=200, int b = 50, int c = 60, int d = 70)
{
	cout << "Sum=" << a - b - c - d << endl; 
}
int main()
{
	testFunc4();//一个实参不传   //20
	testFunc4(150);              //-30
	testFunc4(150, 40);          //-20
	testFunc4(150, 40, 20);      //20
	testFunc4(150, 40, 20, 20);  //70
	return 0;
}
  • xdm,如果我只想改变a, c,能不能这样写?

 此时就会出现语法错误!

🍄2.2半缺省参数 

半缺省(值)参数不是参数一般有缺省值,它的范围是有缺省值,但没到全缺省参数的地步。

缺省参数的注意事项:

  1. 缺省值必须是常量或者是全局变量
  2. 缺省值必须从右往左依次给,不能中间跳过这给。
  3. 缺省参数不能在声明和定义中重复出现。
  • 注意事项1:
//正确示例
int x = 30;//全局变量
void Print(int a, int b = 20, int c = x)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}
  • 注意事项2:

在2.1中最后的语法错误的原因就是第2条,因为缺省值是从右到左挨着给的,有可能左边的一些参数没给到备胎。

而实参是从左往右依次给到功能函数的,有很大可能是功能函数的左边的形参既未接收到实参传递的参数,而又没有给他缺省值,所以这个形参就被漏掉了,所以就出现了语法错误。

void testFunc2(int a, int b, int c=60, int d=70)
{
	cout << "Sum=" << a + b + c + d << endl;
}

这个就是半缺省参数(不是说一半有缺省值,一半没有)

如果想让这个功能函数正确运行,那实参最起码传两个值。

 之所以报这个错是因为,你既不给b分配个对象,又不给他备胎,人家能服你吗?

所以你要保证每一个形参都最起码有一个(对象,备胎都可以)能交流的。

  • 缺省参数不一定必须是常量表达式,可以使用任意表达式。当缺省参数是一个表达式时,在函数被调用时该表达式会先求值再被调用。
  • 注意事项3:

是如果在一个.h文件中,那在.c文件中不能再次出现:

//错误示例
//test.h
void Print(int a, int b, int c = 30);
//test.c
void Print(int a, int b, int c = 30)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值