C++缺省参数

缺省参数

什么是缺省参数呢?

简单来说,就是 函数的参数可以给一个默认值,如果不给这个函数传递参数的时候

那么改参数就是默认值 , 否则参数就是你指定的参数

缺省参数分为全缺省和半缺省

  • 全缺省参数: 所有的参数都有默认值
void func(int a=10,int b=20,int c=30)
{
    cout<<"a= "<<a<<endl;
    cout<<"b= "<<b<<endl;
    cout<<"c= "<<c<<endl;
}
int main()
{
    func();//此时 a,b,c都有默认参数,调用不传参
    return 0;
}
/****输出****/
// a= 10
// b= 20
// c= 30
  • 半缺省参数:不是所有的参数都有默认值,也就是说,必须要传递参数给没有默认值的参数
void func(int a,int b,int c=30)
{
    cout<<"a= "<<a<<endl;
    cout<<"b= "<<b<<endl;
    cout<<"c= "<<c<<endl;
}
int main()
{
    //因为a和b两个没有缺省,即最少传两个参数,此时调用错误
    // func();
    
    //正确调用
    func(99,999);
    return 0;
}
/****输出****/
// a= 99
// b= 999
// c= 30

注意事项

  1. 全缺省和半缺省参数都是从左向右传参,传一个参数默认给第一个形参

  2. 半缺省参数必须从右向左依次来给, 并且不能间隔着给

    之所以从右往左缺省是因为,传参是从左向右

    //这是间隔缺省的例子,是错误的
    void func3(int a, int b = 20, int c)
    {
    	/******/
    }
    
  3. 缺省参数不能在函数声明和定义中同时出现,否则会提示重定义默认参数的问题. 原因是因为如果声明和定义给的默认值是一样的,那么就不知道该设置哪一个为默认值了

    规定: 默认参数(缺省参数) 在声明中给定

    // test.h中
    void func(int b, int a, int c = 20);
    // test.c中
    void func(int b, int a, int c /* = 20*/)
    {
        /******/
    }
    
  4. 缺省值必须是常量或者全局变量, 一般都是常量

缺省参数的应用

我们在设计顺序表的时候,第一次需要初始化

而尾插的时候,如果此时需要扩容,那么存在两种情况:

  1. 顺序表的capacity(容量)为0 那么我们就把他设置为4

  2. 否则就capacity 变成二倍

利用缺省参数可以更加巧妙的设计这里

我们在初始化函数中 就设置一个缺省参数,如果用户有需要(知道要插入多少个数据), 可以把capacity设置为100或者更大的数传入进行初始化,这样就减少了一些不必要的扩容(毕竟扩容是有代价的) ,如果没什么需要,因为设置了缺省值,传入的capacity就是默认值4

//test.h
typedef struct SeqList {
	int* a;
	int capacity;
	int size;
}SeqList;
//声明的时候,设置capacity默认为4
void SeqListInit(SeqList* slist, int capacity=4);

//test.c
/*顺序表的初始化*/
void SeqListInit(SeqList* slist, int capacity)
{
	int*tmp = (int*)malloc(sizeof(int) * capacity);
	if (tmp == NULL)
	{
		printf("malloc fail!\n");
		exit(-1);
	}
	slist->a = tmp;
	slist->capacity = capacity;
}
int main()
{
    struct SeqList slist;
    //如果知道 一定会插入100个数据,就可以传参数100
    // 这样提前开辟好空间,减少插入数据时的扩容操作
    SeqListInit(&slist,100);
    return 0;
}
posted @ 2024-01-24 11:38  夏季微凉"  阅读(38)  评论(0编辑  收藏  举报