🌻缺省参数
我们先来看一个简单地例子,对于在函数的定义中三个形参都给定默认值:
#include <iostream>
using namespace std;
void fun(int a = 10, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl<<endl;
}
int main()
{
fun();
fun(11);
fun(11, 22);
fun(11, 22, 33);
return 0;
}
运行结果如下图所示:
对于上面这个函数,它是全缺省函数。
下面,我们再来看一下半缺省函数。对于半缺省函数,缺省值只能从右往左给,必须是连续给。如果从右往左给,会出现歧义。
在上面函数的基础上修改即可得,半缺省函数。
#include <iostream>
using namespace std;
void fun(int a, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl<<endl;
}
int main()
{
fun(1);
fun(1, 2);
fun(1, 2, 3);
return 0;
}
关于缺省参数,我们需要注意的是,不能声明和定义同时给。
若声明和定义同时给,就会出现报错,如下:
对于这个问题,由于函数声明在函数定义之前,因此以声明时给出的默认值为准,而忽略定义函数时给出的默认值。
即:
#include <iostream>
using namespace std;
void fun(int a, int b = 20, int c = 30);
int main()
{
fun(1);
fun(1, 2);
fun(1, 2, 3);
return 0;
}
void fun(int a, int b, int c)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
🌻缺省参数的意义
上面以简单的例子简述了全缺省参数与半半缺省参数。但是缺省参数的函数,有什么意义吗?上面的例子中似乎看不出缺省参数函数的意义。
下面,我们以栈为例,说明缺省参数函数的意义。
我们用栈存储我们的数据,我们会先初始化我们的栈,然后给出一个栈的空间。然后存入我们的数据,如果栈不为满,则继续存入,如果栈满,那么进行扩容。那么问题就在开辟空间这里。我们是开辟10个空间还是100个空间亦或是更多的呢?扩容的时候一般也是根据初始的栈容量进行扩容的,所以一个的空间容量至关重要。
若我们不知道我们要存入多少个数据,我们不妨就设置为开辟4个内存空间,扩容的话,也是4的倍数,这样不至于空间太大的浪费。
若我们提前知道,我们要存入100个或者1000个数据的话,那么我们就直接传入参数为1000,使得初始栈的空间就为1000。
所以接下来我们利用缺省参数的想法来改善一下我们之前的栈结构。如下:
声明栈结构
:
typedef struct Stack
{
int *a;
int top;
int capacity;
}Stack;
初始化栈
:
void StackInit(Stack *ps,int n=4)
{
assert(ps);
ps->a=(int *)malloc(sizeof(Stack)*n);//开辟n个空间;
ps->top=0;
ps->capacity=n;
}
对于栈的初始化,我们就采用了缺省参数。如果我们不清楚要开多少个空间,那么就用我们自己给定的4个空间。
StackInit(&s)
若我们提前知道大概是多少个空间,那么传入参数即可:
StackInit(&s,100);//开辟1001个内存空间
栈的销毁
void StackDestory()
{
assert(ps);
free(p->a);
ps->a=NULL;
ps->top=ps->capacity=0;
}
入栈----StackPush()
void StackPush(Stack *ps,int x)
{
assert(ps);
//判断栈的空间是否已满
if(ps->top==ps->capacity)
{
//扩容为原容量的2倍
datatype *tmp=(int *)relloc(ps->a,sizeof(Stack)*capacity*2);
ps->capacity=ps->capacity*2;
}
ps->a[ps->top]=x;
ps->top++;
}
入栈,扩容也是根据我们capacity的值。这样既可以保证我们的空间够用,且不至于很大的浪费。
出栈----StackPop()
void StackPop(Stack *ps)
{
assert(ps);
//判断当前栈是否为空,若空则无法出栈,退出程序
assert(ps->top >0);
ps->top--;
}