一、什么是缺省参数 缺省参数:是在函数声明或函数定义时为形参指定一个默认值,当调用函数时没有传入对应实参则将默认值做为实参传给形参
注意:函数声明与函数定义中不能同时定义缺省参数,下面代码为错误代码
1 2 3 4 5 6 7 8 void Print (int x = 10 ,int y = 20 ,int z = 30 ) ; void Print (int x = 10 ,int y = 20 ,int z = 30 ) ; { cout << "x = " << x << endl; cout << "y = " << y << endl; cout << "z = " << z << endl; }
说明:
在函数声明与函数定义时都写缺省参数,极容易将两个地方默认值设置的不一致,导致编译器不知道以哪一个默认值为准,所以编译器直接不允许在两处同时写缺省参数
推荐将缺省参数写在函数声明处,一般调用其他人实现函数我们只需要看函数声明知道用法,而不会去看函数定义了解函数怎么实现
二、缺省参数定义 2.1 全缺省参数 全缺省参数:函数中每个形参都有对应默认值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #include <iostream> using namespace std;void Print (int x = 10 ,int y = 20 ,int z = 30 ) ; void Print (int x,int y,int z) { cout << "x = " << x << endl; cout << "y = " << y << endl; cout << "z = " << z << endl; } int main () { Print (); cout << "-------------" << endl; Print (1 ); cout << "-------------" << endl; Print (1 , 2 ); cout << "-------------" << endl; Print (1 , 2 , 3 ); cout << "-------------" << endl; return 0 ; }
输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 x = 10 y = 20 z = 30 ------------- x = 1 y = 20 z = 30 ------------- x = 1 y = 2 z = 30 ------------- x = 1 y = 2 z = 3 -------------
2.2 半缺省参数 半缺省参数:函数中部分形参有对应默认值,半缺省参数必须从右到左给出,不能跳跃给
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include <iostream> using namespace std;void Print (int x, int y = 20 ,int z = 30 ) ; void Print (int x, int y,int z) { cout << "x = " << x << endl; cout << "y = " << y << endl; cout << "z = " << z << endl; } int main () { Print (1 ); cout << "-------------" << endl; Print (1 , 2 ); cout << "-------------" << endl; Print (1 , 2 , 3 ); cout << "-------------" << endl; return 0 ; }
输出
1 2 3 4 5 6 7 8 9 10 11 12 x = 1 y = 20 z = 30 ------------- x = 1 y = 2 z = 30 ------------- x = 1 y = 2 z = 3 -------------
三、缺省参数与函数重载带来的二义性 使用缺省参数可以提高函数的易用性,但是当缺省参数与函数重载不恰当的结合会产生二义性,降低函数的清晰性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 void Print (int x) ;void Print (int x = 1 ,double y = 0.00 ) ;void Print (int x) { cout << "int" << endl; } void Print (int x,double y) { cout << "int、double" << endl; } int main () { Print (1 , 0.0 ); Print (); Print (1 ); }