一、什么是缺省参数
缺省参数:是在函数声明或函数定义时为形参指定一个默认值,当调用函数时没有传入对应实参则将默认值做为实参传给形参
注意:函数声明与函数定义中不能同时定义缺省参数,下面代码为错误代码
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 全缺省参数
全缺省参数:函数中每个形参都有对应默认值
#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;
}
输出:
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 半缺省参数
半缺省参数:函数中部分形参有对应默认值,半缺省参数必须从右到左给出,不能跳跃给
#include <iostream>
using namespace std;
// void Print(int x = 10, int y,int z = 30); 错误,形参z有默认值,形参x有默认值,形参y没有默认值,形成了跳跃
// void Print(int x = 10, int y,int z); 错误,半缺省参数必须从右到左给
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;
}
输出
x = 1
y = 20
z = 30
-------------
x = 1
y = 2
z = 30
-------------
x = 1
y = 2
z = 3
-------------
三、缺省参数与函数重载带来的二义性
使用缺省参数可以提高函数的易用性,但是当缺省参数与函数重载不恰当的结合会产生二义性,降低函数的清晰性
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(int x,double y)
Print(); // 正常调用Print(int x,double y)
Print(1); // 错误,对重载函数调用不明确,有二义性
}