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;
}


输出结果:


1c1a7fac26124211a4f87ac9ce4b73bf.png



上面代码中,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


如果想给缺省参数a和c赋值,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);
}

1

缺省参数函数的声明

如果要对含有缺省参数的函数进行声明,缺省参数只需要在声明中存在,不能在函数声明和定义中同时出现

这么设计的原因是防止函数的声明和定义时,2个缺省参数不一样


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


缺省参数的使用

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


以前我们用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写的缺陷。



目录
相关文章
|
4月前
|
C++
【C++】缺省参数(默认参数)
【C++】缺省参数(默认参数)
46 3
|
4月前
|
编译器 程序员 C++
C++缺省参数
C++缺省参数
42 0
|
3月前
|
编译器 C++
C++进阶之路:何为命名空间、缺省参数与函数重载
C++进阶之路:何为命名空间、缺省参数与函数重载
30 3
|
4月前
|
存储 安全 编译器
【C++入门】缺省参数、函数重载与引用(下)
【C++入门】缺省参数、函数重载与引用
|
1月前
|
编译器 C语言 C++
C++入门 | 命名空间、输入输出、缺省参数
C++入门 | 命名空间、输入输出、缺省参数
33 4
|
4月前
|
C语言 C++ 数据格式
【C++对于C语言的扩充】C++与C语言的联系,命名空间、C++中的输入输出以及缺省参数
【C++对于C语言的扩充】C++与C语言的联系,命名空间、C++中的输入输出以及缺省参数
|
2月前
|
存储 自然语言处理 编译器
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
|
3月前
|
C语言 C++ 编译器
【C++语言】冲突-C语言:输入输出、缺省参数、引用、内联函数
【C++语言】冲突-C语言:输入输出、缺省参数、引用、内联函数
【C++语言】冲突-C语言:输入输出、缺省参数、引用、内联函数
|
4月前
|
编译器 C语言 C++
【C++】基础知识讲解(命名空间、缺省参数、重载、输入输出)
【C++】基础知识讲解(命名空间、缺省参数、重载、输入输出)
26 1
【C++】基础知识讲解(命名空间、缺省参数、重载、输入输出)
|
3月前
|
编译器 C语言 C++
【C++】:C++关键字,命名空间,输入&输出,缺省参数
【C++】:C++关键字,命名空间,输入&输出,缺省参数
33 0