缺省参数的概念是,申明或定义函数时为函数的参数指定一个默认的值;
从概念我们可以知道,缺省参数针对的是函数中的参数;而且是申明或定义函数,说明申明与定义不能同时存在缺省参数;
其基本思路是:
1.当调用中没有参数的时候,使用的就是定义函数的默认值
2.当调用中含有参数,使用的是指定的实参
2.1.当实参是与形参同类型的时候,一切Ok
void func(int a = 0) {
cout << a << endl;
}
int main(){
func(10);
}
其结果是正确打印出10。
2.2当实参与形参不是同类型的时候,那么回是什么情况呢?
void func(int a = 0) {
cout << a << endl;
}
int main(){
func(10.23);
}
其结果为10,并报了warning C4244: “参数”: 从“double”转换到“int”,可能丢失数据的警告;这说明,我们存在实参,并传实参的时候,并非完全不考虑形参的影响,而是受到形参类型的影响,实参会被形参的类型所约束
说完了思路,我们谈谈缺省参数的种类:
缺省参数有两个种类:
1.全缺省参数
2.半缺省参数
1.全缺省参数
void func(int a = 0,int b = 10,int c = 20) {
cout << a << endl;
}
void func(int a = 10){
cout << a << endl;
}
上述的情况我们都可以认为是全缺省参数,为什么呢,因为参数全部都给赋值了,即便只有一个参数
全缺省的情况实参的写法就比较随意了,但是还是要注意一点:
int main() {
func(10,22);
}
就如同上面的实参情况,我们只给了2个参数,但是形参中有3个参数;这怎么理解呢?有些人会认为我只想给a,c赋值,然后我就用上面的形式,可以么?错误;这时因为我们实参是具有顺序的编译器是认为你是一个一个给的即先给a的实参,再给b的实参,再给c的实参,当然这其中可以少给,但是只能少给次序在后面的不能跳着给;如果你实在想变a,c值,你可以这样写:
func(1,10,21)
这样写就是把3个参数都写了,改变了a,c的值唯一没变的就是b的值;它还是10
2.半缺省参数
半缺省的要求就多了,半缺省参数要遵守一条很重要的规则
半缺省参数必须从右往左依次来给出,不能间隔着给
这句话怎么理解呢?说的就是我们定义形参的时候缺省参数可以是由右边开始往左边走,这时候如果全部形参都缺省了就变成全缺省参数
void func(int a ,int b = 10,int c = 20) {
cout << a << endl;
}
int main(){
func(10);
}
上述代码表明,实参我只给a的也行,因为b,c已经由默认的参数了;但是上述参数的给不能跳着给,这是不允许的
为什么形参必须是从右往左给呢,这时因为实参是从左往右给的啊,难道实参还能从右往左给?书写方式都是从左往右,而且代码观察方式都是左->右,这些都是习惯;形参的能从右往左的原因是因为它是个表达式辨识能力强。