1.缺省参数
1.1定义
即函数声明或定义时为函数指定一个缺省值,如果调用函数时传入参数,则变量的值为实参的值,如果调用时未传入参数,则变量的值为缺省值。
//其中a = 0即为定义的缺省值
void Fun_test(int a = 0)
{
cout << "a= " << a << endl;
}
int main()
{
//传入参数,a为实参值,输出a = 1
Fun_test(1);
//未传入参数,a为缺省值,输出a = 0
Fun_test();
return 0;
}
1.2缺省参数分类
即函数的参数传入了缺省值,调用函数时如果想要使用缺省值,必须保证从右往左连续使用。
1.2.1全缺省参数
即函数的所有参数传入了缺省值,调用函数时如果想要使用缺省值,必须保证从右往左连续使用。
void Func_test(int a = 10, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
int main()
{
//使用缺省值,必须从右往左连续使用,即本利按c b a顺序缺省
//输出1 2 3,即未使用缺省值
Func_test(1, 2, 3);
//输出1 2 30,c变量使用了缺省值
Func_test(1, 2);
//输出1 20 30,b c变量使用了缺省值
Func_test(1);
//输出10 20 30,a b c变量均使用了缺省值
Func_test();
}
1.2.2半确实参数(部分缺省)
即函数的部分参数传入了缺省值,且缺省值必须从右往左连续缺省,调用函数时如果想要使用缺省值,必须保证从右往左连续使用。
void Func_test(int a, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
int main()
{
//使用缺省值,必须从右往左连续使用,即本利按c b a顺序缺省
//输出1 2 3,即未使用缺省值
Func_test(1, 2, 3);
//输出1 2 30,c变量使用了缺省值
Func_test(1, 2);
//输出1 20 30,b c变量使用了缺省值
Func_test(1);
}
1.3总结
注意:
-
半缺省参数必须从右往左依次来给出,不能间隔着给
-
缺省参数不能在函数声明和定义中同时出现,当在main函数中调用Func时会报错。(因为这种情况下,如果两个缺省值给不同值,编译器不知道该调用哪个),同时出现时建议在声明时给缺省参数,定义时不给。
//a.h文件中的函数声明
void Func(int a = 20);
// a.cpp文件中的函数定义
void Func(int a = 20)
{}
//下面这种情况下,编译器就分不清到底该使用哪个缺省值,所以不支持声明与定义都用缺省值
//a.h1文件中的函数声明
void Func(int a = 10);
// a.cpp1文件中的函数定义
void Func(int a = 20)
{}
//同时出现时建议在声明时给缺省参数,定义时不给。
3.缺省值必须是常量或者全局变量
2.函数的重载
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数或类型或类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。即:有三种情况,看以下示例。
//1.参数类型不同,int 与 int
int Add(int left, int right)
{
cout << "int(left + right)" << endl;
return left + right;
}
//double 与 double
double Add(double left, double right)
{
cout << "double(left + right) " << endl;
return left + right;
}
//2.参数的个数不同,无参数
void fun()
{
cout << "f" << endl;
}
//一个参数
void fun(int a)
{
cout << "f(a)" << endl;
}
//两个参数
void fun(int a, int b)
{
cout << "f(a,b)" << endl;
}
//3.参数的类型顺序不同,int 与 char
void fun(int a, char b)
{
cout << "fun(int a, char b)" << endl;
}
//char 与 int
void fun(char a, int b)
{
cout << "fun(char a, int b)" << endl;
}
2.1C++支持函数重载原理
C++在编译过程中,按照一定规则将函数名保留,还会保留参数的类型与顺序。
例如:
//可以简单理解为下面两种情况
// _Z3Addii-> _Z3:公共部分 Add:函数名 ii:参数类型 int int
int Add(int left, int right)
{
cout << "int(left + right)" << endl;
return left + right;
}
// _Z3Adddd-> _Z3:公共部分 Add:函数名 dd:参数类型 double double
double Add(double left, double right)
{
cout << "double(left + right) " << endl;
return left + right;
}
当然这只是方便理解,具体的规则根据编译器不同规则也不同,真正规则可能复杂的多,但是可以这样理解。
2.2总结
1.函数重载有三种情况,参数类型不同、参数个数不同、参数类型顺序不同。
2.返回值不同时不能构成函数重载。原因如下:
int Add(int left, int right)
{
cout << "int(left + right)" << endl;
return left + right;
}
double Add(int left, int right)
{
cout << "double(left + right) " << endl;
return left + right;
}
int main()
{
//因为如果只有返回值不同,函数参数相同时,调用函数时,编译器无法区分调用的是哪个Add函数
Add(1,2);
Add(2,3);
}