其实在C++基础一文中已经介绍过了缺省参数,但是每次用这玩意都是很迷,今天趁着复习c++知识,再来总结一下缺省参数。
🌈1.缺省参数知识图:
看来看去也就这么多的知识点,接下来就一一介绍一下:
🍄1.1缺省参数的概念:
缺省参数:是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参 。
不就是备胎吗,无人可用了用备胎。
#include<iostream> using namespace std; void testFunc(int a = 0) { cout << "a:" << a << endl; } int main() { testFunc();//没有指定实参,使用缺省值(用备胎) testFunc(10);//指定实参,使用实参 return 0; }
- 那啥是缺省值?
int a=0 中 0就是缺省值,为啥叫缺省值呢?本来主函数应该传递实参给功能函数,但是这小子它缺工减料,它不传,那形参是不是必须找备胎了,要不没法玩,这个备胎就是可以缺省的,下次如果传实参,备胎就上一边去了,所以把这个备胎就做缺省值。
🍄1.2缺省参数对于实形参个数不同的作用
- 在处理这个问题之前我还有一个疑问, 在座的各位知不知道啥是实参,形参?
我在这也不在絮百度上的概念了,在main()主函数中,要调用功能函数,往功能函数中传入的参数就是实参(10),而功能函数testFunc()必须要找一个参数来接收主函数传来的实参,而接收的这个东西就叫形参。
同志们,如果说现在咱们还是二年级小可爱,老师给我们留了一个4个数相加 的作业,但是呢,每一次就其中的唯一一个数变化,那我们还要每次都把其他三个数再算一次吗?此时我们只需要每次改变那一个数就行了。
void testFunc2(int a, int b=50, int c=60, int d=70) { cout << "Sum=" << a + b + c + d << endl; } int main() { testFunc2(40);//没有指定实参,使用缺省值(用备胎) return 0; }
也就是说只要每次改变a的值就行了。
- 缺省参数的函数调用:
缺省实参并不一定是常量表达式,可以是任意表达式,甚至可以通过函数调用给出。如果缺省实参是任意表达式,则函数每次被调用时该表达式被重新求值。但表达式必须有意义。
void testFunc3(int a, int b = int{}, int c = int(), int d = 70) { cout << "a:" << a << endl; //40 cout << "b:" << b << endl; //0 cout << "c:" << c << endl; // 0 cout << "d:" << d << endl; //70 cout << "Sum=" << a + b + c + d << endl; //10 }
至于为啥int b=int{},int c=int()的缺省值为啥是0,这个不用知道也没啥问题。
🌈 2.缺省参数的分类
🍄2.1全缺省参数
同志们,之所以都迷缺省参数到底是缺那里,估计是缺省参数这个名字误导了咱们,大致是不是认为缺省值是不给形参备胎,别人有,它没有就是缺省。如今看来那是方向都错了。 以后把这个名字补全。
全缺省值参数(每一个形参都有缺省值(备胎))
全缺省参数并不仅仅是主函数中一个实参都不传,而是每一个形参都有缺省值。实参要是相传也可以传。
void testFunc4(int a=200, int b = 50, int c = 60, int d = 70) { cout << "Sum=" << a - b - c - d << endl; } int main() { testFunc4();//一个实参不传 //20 return 0; }
- 实参也可以任意数量传入:
void testFunc4(int a=200, int b = 50, int c = 60, int d = 70) { cout << "Sum=" << a - b - c - d << endl; } int main() { testFunc4();//一个实参不传 //20 testFunc4(150); //-30 testFunc4(150, 40); //-20 testFunc4(150, 40, 20); //20 testFunc4(150, 40, 20, 20); //70 return 0; }
- xdm,如果我只想改变a, c,能不能这样写?
此时就会出现语法错误!
🍄2.2半缺省参数
半缺省(值)参数不是参数一般有缺省值,它的范围是有缺省值,但没到全缺省参数的地步。
缺省参数的注意事项:
- 缺省值必须是常量或者是全局变量。
- 缺省值必须从右往左依次给,不能中间跳过这给。
- 缺省参数不能在声明和定义中重复出现。
- 注意事项1:
//正确示例 int x = 30;//全局变量 void Print(int a, int b = 20, int c = x) { cout << a << endl; cout << b << endl; cout << c << endl; }
- 注意事项2:
在2.1中最后的语法错误的原因就是第2条,因为缺省值是从右到左挨着给的,有可能左边的一些参数没给到备胎。
而实参是从左往右依次给到功能函数的,有很大可能是功能函数的左边的形参既未接收到实参传递的参数,而又没有给他缺省值,所以这个形参就被漏掉了,所以就出现了语法错误。
void testFunc2(int a, int b, int c=60, int d=70) { cout << "Sum=" << a + b + c + d << endl; }
这个就是半缺省参数(不是说一半有缺省值,一半没有)
如果想让这个功能函数正确运行,那实参最起码传两个值。
之所以报这个错是因为,你既不给b分配个对象,又不给他备胎,人家能服你吗?
所以你要保证每一个形参都最起码有一个(对象,备胎都可以)能交流的。
- 缺省参数不一定必须是常量表达式,可以使用任意表达式。当缺省参数是一个表达式时,在函数被调用时该表达式会先求值再被调用。
- 注意事项3:
是如果在一个.h文件中,那在.c文件中不能再次出现:
//错误示例 //test.h void Print(int a, int b, int c = 30); //test.c void Print(int a, int b, int c = 30) { cout << a << endl; cout << b << endl; cout << c << endl; }