前言
继上回我们学习了命名空间和在C++里面的输入输出之后,我们知道了命名空间可以解决C语言命名冲突的问题,也简单掌握了命名空间的使用,我们已经可以写出简单的C++代码,所以大家还是要继续练习敲代码,提高语感。
#include <iostream>
using namespace std;
int main()
{
cout << "hello world" << endl;
return 0;
}
而今天我们就继续来学习C++对C语言的改进,今天主要介绍的是缺省参数。
让我们一起往下学习吧!
一、缺省参数的诞生
1.1 缺省的意思
缺省是一种计算机的术语,大家理解成默认的意思就行,所以缺省参数的意思就是默认参数
1.2 缺省参数诞生的原因
既然缺省参数是一个参数,大家可以想一下什么的场景下会用到参数呢?用到函数的时候会用到参数对吧,大家继续想一下,在C语言中,我们没有给函数的形参传值的时候,函数的形参是不是都没有默认值,也就是,我们只要不传参数,就会编译错误,所以C++在这方面做了改善,给函数的形参增加了缺省值(默认值),大家知道这点之后,就让我们正式学习一下缺省参数吧!
二、缺省参数的定义
缺省参数是在声明或者定义函数时,为函数的参数指定一个缺省值(默认值)。
在调用该函数时,如果我们没有给指定的实参,则采用该形参的缺省值,否则使用指定的实参。
看下面代码和执行的结果:
#include <iostream>
using namespace std;
int Add(int x,int y = 3)
{
return x + y;
}
int main()
{
int sum1 = Add(2);
int sum2 = Add(2,4);
cout << "没有给y传入实参的sum1 = " << sum1 << endl;
cout << "给y传入实参的sum2 = " << sum2 << endl;
return 0;
}
从这里可以看出我们给y一个缺省参数为3
所以当我们传实参只传了个2的时候,只是给x传,而没有给y传,所以返回的就是5
但是当我们都传入了实参的时候,返回的就是6
这就应证了上面的话:在调用该函数时,如果我们没有给指定的实参,则采用该形参的缺省值,否则使用指定的实参。
那缺省参数可以怎么写呢?如果存在多个参数,我们可以随意地给缺省值吗?接下来就是我们下一个要学习的东西,缺省参数的分类
三、缺省参数的分类
3.1 全缺省参数
顾名思义,就是把所有的形参都给上缺省值
下面的代码就是把所有的形参都给了缺省值,这样的就叫做全缺省参数。我们写完函数体之后,肯定要调用我们的函数,但是这里就又出现了问题,我们应该如何去调用呢?
我们将下面的代码放到自己的编辑器上,就会发现如下报错:
#include <iostream>
using namespace std;
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(); // 1
Func(1); // 2
Func(1,2); // 3
Func(1,2,3); // 4
Func(1,,3); // 5 错误
Func(,,3); // 6 错误
return 0;
}
这里的报错就说明的我们在调用含有缺省参数的函数时,传入的形参必须是从左往右依次传入,不能跳着给。
3.2 半缺省参数
既然知道了全缺省参数是全部的形参都给缺省值,那半缺省参数就是不给全部,只给一部分的形参 缺省值
那我们可以怎么给缺省值呢?可以跳着给吗?让我们一起看看吧!
我们如下三种代码,经过测试只有第一个是对的
所以也就是说半缺省参数,禁止跳着给,也禁止给左边不给右边
那半缺省参数的规则就是:
从右往左依次给
void Func(int a, int b = 20, int c = 30)
{
cout <<"a = "<< a << endl;
cout <<"b = "<< b << endl;
cout <<"c = "<< c << endl << endl;
}
void Func(int a = 10, int b, int c = 30)
{
cout <<"a = "<< a << endl;
cout <<"b = "<< b << endl;
cout <<"c = "<< c << endl << endl;
}
void Func(int a = 10, int b = 20, int c)
{
cout <<"a = "<< a << endl;
cout <<"b = "<< b << endl;
cout <<"c = "<< c << endl << endl;
}
在讲完这些,关于缺省参数还有一个重要的规则要说明一下
四、缺省参数在函数定义和函数声明中的规则
我们规定,缺省参数不能在函数的定义和声明中同时出现
如果函数定义和声明同时存在,缺省参数放到函数声明中。
由于函数的定义在主函数的上面再进行声明是冗余(多余)的声明,所以我把函数定义放在主函数下定义:
在这段代码中,我们的函数定义和函数声明是同时存在的,所以我们把缺省参数放在函数声明里,这个是可以正常运行的。
#include <iostream>
using namespace std;
void Func(int a = 10,int b = 20,int c = 30 );
int main()
{
Func(1);
Func(1,2);
Func(1,2,3);
return 0;
}
void Func(int a,int b,int c)
{
cout <<"a = "<< a << endl;
cout <<"b = "<< b << endl;
cout <<"c = "<< c << endl << endl;
}
但是我在这里把缺省参数放到函数的定义里,不放在函数声明里,在调用的时候就会报错,这是为什么呢?
因为在我们的程序里,它会以函数声明为准,函数声明里都没有缺省参数,我们不可以用有缺省参数的形式来传参,所以里面两个会报错。
综上所述,我们以后在面对函数定义和函数声明同时存在的时候,需要用到缺省参数时,一定要放在声明中。