C++之函数的缺省参数

本文详细解析了C++中缺省参数的概念,区分了全缺省和半缺省参数,强调了设置缺省参数的规则,包括顺序、函数声明与定义中的使用限制,以及缺省值必须为常量或全局变量。通过实例演示,助你掌握函数参数的灵活运用。
摘要由CSDN通过智能技术生成


前言

编译工具: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 例程1运行结果

  例程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 例程2运行结果

  调用全缺省函数时,可以不用传任何参数,如果传入参数则默认从最左侧开始赋值。比如例程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 例程3运行结果

  例程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 例程4的运行结果

  从例程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 例程5的运行结果

  例程5中,定义了一个全局变量Max,并将其作为参数score的缺省值。当我们改变全局变量Max的值时,函数参数的缺省值也跟着改变。


总结

  本文讲述了缺省参数的相关知识点,首先介绍了缺省参数的概念,并举例说明了缺省参数的分类,最后给出了缺省参数的三个注意点。缺省参数概念是函数重载的基础,了解了缺省参数的概念就可以去学习函数重载了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值