> 文章列表 > C++缺省参数

C++缺省参数

C++缺省参数

目录

  • 什么是缺省参数
  • 缺省参数分类
    • 全缺省参数
    • 半缺省参数
  • 缺省参数函数的声明
  • 缺省参数的使用

什么是缺省参数

缺省参数是声明定义函数时,为函数的参数指定一个缺省值。
在调用该函数时,如果没有指定实参,那么形参就会采用缺省值,如果指定了实参,就使用实参值
缺省参数是C++特有的,C语言不支持

#include <iostream>
using namespace std;void test(int a = 1)//这里的a就是缺省参数
{cout << a << endl;
}int main()
{test();    //没有传参时,采用参数的默认值test(10);  //有传参时,采用实参值return 0;
}

输出结果:
C++缺省参数

上面代码中,test函数里的形参a就是一个缺省参数

还有一点要注意的是缺省值必须是常量或者全局变量,其他不可以


缺省参数分类

全缺省参数

全缺省参数,顾名思义,就是为每一个函数形参都
赋了一个缺省值

//全缺省参数
void test2(int a = 10, int b = 20, int c = 30)
{cout << a << endl;cout << b << endl;cout << c << endl;
}int main()
{test2();//没有传参时,采用参数的默认值test2(1);//传了1个参数,形参a采用实参值,其余采用参数的默认值test2(1,2);//传了2个参数,形参a,b采用实参值,剩下的c采用参数的默认值test2(1,2,3);//传了3个参数,全都采用实参值return 0;
}

这里对缺省参数的赋值只能从左往右赋值,不能 “跳着” 赋值
什么叫从左往右呢?
就是test2(1),里面有1个实参值,那么形参参数列表从左开始第一个形参就是a,所以这个1的形参值就是赋
a
同理test2(1,2),里面有2个实参值,形参参数列表从左往右的2个形参是a b,1、2就被赋值给了a b

如果想给缺省参数ac赋值,b采用缺省值,其实是无法实现的,因为给缺省参数赋值只能从左往右,跳过一个赋值是实现不了的


半缺省参数

半缺省参数,不是缺省一半的参数,而是部分参数是缺省的

半缺省参数必须是从右往左依次来给出,不能间隔着给

//半缺省参数
void test3(int a, int b = 20, int c = 30)
{cout << a << endl;cout << b << endl;cout << c << endl;
}int main()
{test(1);test(1,2);test(1,2,3);
}

缺省参数函数的声明

如果要对含有缺省参数的函数进行声明,缺省参数只需要在声明中存在,不能在函数声明和定义中同时出现
这么设计的原因是防止函数的声明和定义时,2个缺省参数不一样

下面我们看一下如果在函数声明和定义中同时出现缺省参数的结果
C++缺省参数


缺省参数的使用

我们用顺序表的初始函数来说明一下缺省参数的使用场景

以前我们用C语言实现顺序表是这样的

#include <stdio.h>
#include <stdlib.h>#define DEFAULT 4
struct SList
{int* a;int size;int capacity;
};void SlistInit(struct SList*plist)
{plist->a = (int*)malloc(sizeof(struct SList) * DEFAULT);if (plist->a == NULL){perror("malloc fail");return ;}plist->size = 0;plist->capacity = DEFAULT;}

因为是动态开辟,我们不知道表里需要多大空间,所以我们给表的空间大小初始化为4
但是如果我们知道要存100个数据,而空间大小初始化为4,那么需要多次空间开辟,而空间开辟又是有消耗的,所以我们可以改为#define DEFAULT 100,但是将DEFAULT 改为100后,如果其他情况下不需要100空间大小,那么开100个空间又浪费了

所以我们可以通过缺省参数去升级写法:

void SlistInit(struct SList*plist,int defaultcapacity = 4)
{plist->a = (int*)malloc(sizeof(struct SList) * defaultcapacity);if (plist->a == NULL){perror("malloc fail");return ;}plist->size = 0;plist->capacity = defaultcapacity;
}

如果这样写,当我们知道表中会存多少元素时,我们可以通过对缺省参数传参,改变defaultcapacity 的值,直接开辟正好的空间,避免多次开辟,有消耗

当我们不知道表中会存多少元素时,不用对缺省参数传参,defaultcapacity 采用缺省值,在后序的操作中,按需扩容,避免空间浪费

这样写就完美的解决了之前用C写的缺陷。