个人主页:平行线也会相交
欢迎 点赞 收藏✨ 留言✉ 加关注本文由 平行线也会相交 原创
收录于专栏【C++之路】
本文来详细介绍C++中的缺省参数。正文开始:
缺省参数也叫默认参数,缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定的实参则采用该形参的缺省值,否则使用指定的实参。
我们具体来意一小截代码:
void fun(int a = 0)
{
cout << a << endl;
}
上面代码中void fun(int a = 0)
中的int a = 0
,即在形参的位置上给a赋值了0
,这就是缺省参数。意思就是我们在进行函数传参的时候,我们既可以不给a进行赋值,也可以给a进行赋值。就比如:
当函数中有三个参数时,请看:
注意这里实参传给形参的顺序是从左到右的,而栈帧调用的压参数,即参数入栈有的地方是从左往右有的地方是从右往左(具体取决于编译器)
。
还要注意,我们是不可以跳着进行传参的。
比如:
这里记住就好,即缺省参数不可以跳着进行传参。因为我们的祖师爷(本贾尼)当时就是这么规定的。
以上的缺省就是全缺省。
下面来看半缺省,即我们缺省部分参数(并不是缺省一般)。
注意我们的半缺省的顺序是从右往左进行缺省的,如果我们从左往右进行缺省传参,就会报错,请看:
所以我们要从右往左进行缺省。比如:
//半缺省
void func(int a, int b, int c = 3)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
int main()
{
func(4, 5);
func(4, 5, 6);
return 0;
}
还有一点需要我们注意,半缺省是我们不可以什么都不全,如下图:
上图错误就是因为半缺省时一个参数都没有传导致的,上图的半缺省我们至少要传两个才可以
。比如:
//半缺省
void func(int a, int b, int c = 3)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
int main()
{
func(4, 5);
/*func(4, 5);
func(4, 5, 6);*/
return 0;
}
缺省参数具体有什么用途呢?我们就拿栈的初始化来举例:
上图的栈经过初始化后可以存放4个数据,但是如果我们此时想插入100个、甚至是1000个数据的话,就需要我们不断的进行扩容,所以就很麻烦,这个时候我们就可以这样:
这样会减少一点扩容带来的消耗。
倘若现在我们对栈进行初始化的时候不知道要插入多少个数据,我们就可以用缺省参数来解决问题,请看:
这里我们不知道要插入多少个数据,所以就默认情况下开辟4个。如果想要控制要插入多少个数据的话直接显式的传参就好了:
比如:
好了,就到这里,以上内容就是C++缺省参数的具体使用。
如果缺省参数在声明和定义中同时出现的话,就会报错,比如:
所以,缺省参数不能在函数声明和定义中同时出现,因为如果我们声明和定义如果默认参数不一致的话,我们应该听谁的呢?比如在声明中默认参数是4,而到了定义中默认参数是40,那到底默认参数是几呢?故缺省参数不能在函数声明和定义中同时出现。
还有一个问题就是缺省参数到底是声明给呢还式定义给呢?
我们先来看看定义给:
我们发现如果定义给的话报错了,主要问题就是函数不接受一个参数。
首先在编译阶段的预处理阶段,在两个.cpp文件中展开.h头文件
,两个.cpp文件在编译阶段各走各的(在链接阶段才会合到一起),
这里出错是在编译阶段就报错了,因为我们包含的头文件是.h
,而.h
文件中只有声明没有定义而编译器在处理的时候发现一开始传参传了两个参数,后来就值传了一个参数,请看下图:
故缺省参数定义给是不可以的。
那如果是声明给呢,请看:
这里我们发现程序是可以正常运行的,当编译器处理StackInit(&st1, 100);
的时候按照正常传参即可(跟缺省参数没有什么关系);而当编译器处理StackInit(&st2);
的时候,我们由于在声明中给了缺省,所以编译器在编译的时候,我们可以认为编译器会把StackInit(&st2);
转换为StackInit(&st2,4);
,所以对于函数定义而言根本不需要关心到底是不是缺省的,因为函数定义的时候都要传两个参数给它,所以声明调用的时候如果只有一个参数,会转换成两个参数
。故缺省参数声明给而定义不给
。
1.缺省参数(也叫默认参数)分为部分缺省和全缺省。
2.缺省参数不能在函数声明和定义中同时出现
,同时缺省参数只能给声明而不能给定义(编译器会自动转换)。
3.缺省参数可以提供更加灵活的函数调用
(可以理解为弥补C的一个短板吧)。