如下,我们可以给函数形参列表的形参赋予初始值,有了这个初始值,我们也可以不用传递实参!而当这个初始值和实参不同时,还以实参为主;
int Add(int a=100, int b=100)
{
return a + b;
}
int c = Add();
形参列表中前一位被赋予初始值,那么后面每一位都要赋予初始值(即下图中不能a有初始值而b没有)。注意:函数的声明和调用不能同时有默认参数。
//错误!
int Add(int a = 10, int b = 10);
int Add(int a=10, int b=20)
{
return a + b;
}
2.函数参数的占位:
函数参数的占位可以理解为开辟一块没有名字的形参空间,不过我们还是要为这块空间传递实参或者设定默认参数:
int M(int a, int)
{
return a;
}
int main()
{
int num1 = 10, num2 = 5;
int d = M(num1,num2);
cout << d << endl;
return 0;
}
3函数的重载:
函数的重载指的是在同一个程序中可以出现重复的函数名,只需要它们满足下面的条件:
- 函数的作用域相同(即在不在某个函数内部或者别处)
- 函数的名称相同
- 函数的参数不同、顺序不同、个数不同
- 函数返回值的差异不能作为重载的条件
- 函数参数顺序不同指的是类型顺序不同,不是变量名书顺序不同
void fun(int a)
{
cout << "fun_int" << endl;
}
void fun(char a )
{
cout << "fun_char" << endl;
}
//失败,形参顺序不同是数据类型顺序不同
//void fun(char a, int b)
//{
// cout << "fun_char_int" << endl;
//}
//
//void fun(char b, int a)
//{
// cout << "fun_int_char" << endl;
//}
//失败,返回值不能区分函数
//void fun()
//{
// cout << "fun_non_ret" << endl;
//}
//
//int fun()
//{
// cout << "fun_int_ret" << endl;
//}
int main()
{
fun('a');
fun(2);
//fun('a',2);
return 0;
}
注意事项:
1.引用也可以作为区分函数的条件,并且加了const和不加const的引用可以根据输入的数值是否为变量来调用不同的函数:
void func(const int& a)
{
cout << "C" << endl;
}
void func(int& a)
{
cout << "Nc" << endl;
}
int main()
{
int a = 10;
func(10);//10为常量,输出C
func(a);//a为变量,输出Nc
return 0;
}
2.默认参数也可以在一定情况下作为重载函数的条件:只要默认参数的存在能区分函数就可以
void func(int a, int b = 10)
{
cout << "T" << endl;
}
void func(int a)
{
cout << "O" << endl;
}
int main()
{
func(1,2);//调用第一个,因为只有第一个满足有两个形参,此时默认参数有无意义不同
//fun(1)错误,因为第一个函数和第二个函数都可以接收一个参数,此时默认参数有无意义一样
return 0;
}



