文章目录
前言
编译工具:visual studio 2019
语言:C++
1.1 缺省参数概念
缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。
例程1:
#include<iostream>
using namespace std;
void TestFunc1(int a = 0) {//参数默认值为0
cout << a << endl;
}
int main()
{
TestFunc1(); // 没有传参时,使用参数的默认值
TestFunc1(10); // 传参时,使用指定的实参
}
运行结果:
例程1中,函数TestestFunc1的参数a属于缺省参数,缺省值为0。如果在调用TestestFunc1函数时,没有传参,则使用默认参数0,如果有传参,则使用指定的实参。
1.2 缺省参数分类
1.2.1 全缺省参数
全缺省参数顾名思义就是函数的参数全部都属于缺省参数,显然例程1中的TestFunc1函数的参数就属于中的全缺省参数。
例程2:
#include<iostream>
using namespace std;
void TestFunc2(int a = 10, int b = 20, int c = 30) {
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
int main()
{
cout << "不传入参数" << endl;
TestFunc2();
cout << "传入一个参数" << endl;
TestFunc2(1);
cout << "传入两个参数" << endl;
TestFunc2(1, 2);
cout << "传入三个参数" << endl;
TestFunc2(1, 2, 3);
return 0;
}
运行结果:
调用全缺省函数时,可以不用传任何参数,如果传入参数则默认从最左侧开始赋值。比如例程2中,当传入1个参数时,默认把参数传递给a;传入2个参数时(1, 2),则赋值顺序为:1传递给a、2传递给b;传递三个参数也是从最左侧开始赋值,即a = 1、b = 2、c = 3。
1.2.2 半缺省参数
半缺省参数即函数的参数至少有一个参数没有缺省值。
例程3:
#include<iostream>
using namespace std;
void TestFunc3(int a, int b, int c = 30) {
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
int main()
{
cout << "传入两个参数" << endl;
TestFunc3(1, 2);
cout << "传入三个参数" << endl;
TestFunc3(1, 2, 3);
return 0;
}
运行结果:
例程3中,函数TestFunc3的两个参数不具备缺省值,所以调用时,至少要传入两个参数,否则会出错。
1.3 缺省参数使用注意事项
1.3.1 缺省参数必须从右往左依次来给出,不能间隔着设置缺省参数
比如对于TestFunc3函数,如果是以下两种定义方式则会出错:
错误1:没有把缺省参数放在最右侧
void TestFunc3(int a = 10, int b, int c)
错误2:试图间隔着设置缺省参数
void TestFunc3(int a = 10, int b, int c = 30)
提示:如果你想把某个参数设置为缺省参数,只需把该参数放在最右侧就可以了。
1.3.2 缺省参数不能在函数声明和定义中同时出现
例如:
可以看到在定义函数TestFunc4时,由于声明和定义中都出现了缺省参数,在visual studio 2019编译器中无法编译通过。编译器之所以这么做是为了防止出现歧义,比如,当声明与定义位置同时出现缺省参数,而且恰巧两个位置提供的值不同,那编译器就无法确定到底该用哪个缺省值。必须把声明或定义中参数的默认值去掉一个,针对以上错误,程序可以更改如下。
修改1:去掉声明中参数的默认值
1.//函数声明
2.void TestFunc4(int a);
3.//函数定义
4.void TestFunc4(int a = 0) {
5. cout << "a = " << a << endl;
6.}
修改2:去掉定义中参数的默认值
1.//函数声明
2.void TestFunc4(int a = 0);
3.//函数定义
4.void TestFunc4(int a) {
5. cout << "a = " << a << endl;
6.}
例程4:
#include<iostream>
using namespace std;
//函数声明
void TestFunc4(int a);
//函数定义
void TestFunc4(int a = 0) {
cout << "a = " << a << endl;
}
int main()
{
TestFunc4();
return 0;
}
运行结果:
从例程4中可以看到,当去掉声明中参数的默认值时,程序可以正常运行。
1.3.3 缺省值必须是常量或者全局变量
以上的程序中参数的缺省值都是常量,下面举一个缺省值为全局变量的例子。
例程5:
#include<iostream>
//#define MAX 100
using namespace std;
int Max = 100;
void TestFunc5(int score = Max) {
cout << "score = " << score << endl;
}
int main()
{
cout << "全局变量作为缺省值: ";
TestFunc5();
cout << "改变全局变量的值: ";
Max = 150;
TestFunc5();
return 0;
}
运行结果:
例程5中,定义了一个全局变量Max,并将其作为参数score的缺省值。当我们改变全局变量Max的值时,函数参数的缺省值也跟着改变。
总结
本文讲述了缺省参数的相关知识点,首先介绍了缺省参数的概念,并举例说明了缺省参数的分类,最后给出了缺省参数的三个注意点。缺省参数概念是函数重载的基础,了解了缺省参数的概念就可以去学习函数重载了。