默认实参是为了事先提供默认的实参便于更加灵活方便的使用函数
#include<iostream>
using namespace std;
void MyCout(int n=100) //这里的n=100就是默认实参
{
cout <<n<< endl;
}
int main()
{
int a=200;
//因为MyCout存在默认实参所以我在调用的时候可以不传参数直接调用
MyCout();
MyCout(a);
system("pause");
return 0;
}
从上图可以看出,MyCout();执行时虽然没有传入实参但因为函数定义时给了默认实参,所以传入的实参就为默认实参
默认实参导致的二义性
因为默认实参的使用有时候可能会使得原本不存在二义性的重载函数出现二义性
#include<iostream>
using namespace std;
void MyCout(int n=100)
{
cout <<n<< endl;
}
void MyCout(char n = '1')
{
cout << n << endl;
}
int main()
{
MyCout();
system("pause");
return 0;
}
从上图可以看出:
因为重载函数MyCount()的两个重载类型都提供了默认实参,在不提供实参进行函数调用时,两个重载类型都可以与其进行匹配,就会导致编译器无法确定改掉用那个重载函数从而导致二义性。
默认实参如何避免二义性
为了解决默认实参导致的函数重载出现二义性的问题,使用默认实参时应该遵守以下两点的任意一点。
1. 函数声明的唯一性
在重载函数的生命时避免像MyCout(int a=100)和MyCout(char a=‘a’)这样在使用默认实参时无法精准匹配的情况;
2. 函数调用时的唯一性
在函数调用时建议使用确定的类型来进行重载函数的精准匹配
默认实参的正确使用
函数存在多个参数时使用默认实参必须从右往左进行默认实参匹配:
#include<iostream>
using namespace std;
void MyCout(int m,char n = '1')
{
cout <<m<<" "<<n<< endl;
}
int main()
{
MyCout(10);
system("pause");
return 0;
}
从运行结果可以看出:
右边的默认实参成功传入函数内部
如果将默认实参写在左边会发生什么事呢?
#include<iostream>
using namespace std;
void MyCout(char n = '1',int m)
{
cout <<m<<" "<<n<< endl;
}
int main()
{
MyCout(10);
system("pause");
return 0;
}
可以看出:
这时候报错:”MyCout缺少参数2的默认参数“,所以在使用默认实参的时候,默认实参必须从右往左写!