1. 缺省参数
1.1 定义
缺省参数是声明或定义函数时为函数的参数指定一个缺省值(默认值)。在调用该函数时,如果没有指定实参 则采用该形参的缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省参数。
void Func(int a = 0)
{
cout << a << endl;
}
缺省参数分为全缺省和半缺省参数,全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左 依次连续缺省,不能间隔跳跃给缺省值。同样地,带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参。
注意,声明或调用时给出缺省值,但不能在声明和调用时都给出缺省值,一处给出即可。
// 全缺省
void Func1(int a = 10, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
// 半缺省
void Func2(int a, int b = 10, int c = 20)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
// 错误缺省
void Func3(int a = 10, int b = 20, int c)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
按如下方式运行可得:
int main()
{
Func1();
Func1(1);
Func1(1,2);
Func1(1,2,3);
Func2(100);
Func2(100, 200);
Func2(100, 200, 300);
return 0;
}
1.2 作用
void STInit(ST* ps, int n = 4);
// Stack.cpp
#include"Stack.h"
// 缺省参数不能声明和定义同时给
void STInit(ST* ps, int n)
{
assert(ps && n > 0);
ps->a = (STDataType*)malloc(n * sizeof(STDataType));
ps->top = 0;
ps->capacity = n;
}
// test.cpp
#include"Stack.h"
int main()
{
ST s1;
STInit(&s1);
// 确定知道要插⼊1000个数据,初始化时⼀把开好,避免扩容
ST s2;
STInit(&s2, 1000);
return 0;
}
STInit函数在声明时是以缺省参数的方式给出的,栈的容量默认给了4。但是,如果已经确定至少有1000个数据要插入,那么就可以在调用STInit时多传入一个参数“1000”,将所需的空间一次性开好,避免扩容带来的消耗。
2. 函数重载
2.1 定义
C++支持在同一作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者参数类型不同。这样C++函数调用就表现出了多态行为,使用更灵活。C语言是不支持同一作用域中出现同名函数的。
// 1、参数类型不同
int Add(int left, int right)
{
cout << "int Add(int left, int right)" << endl;
return left + right;
}
double Add(double left, double right)
{
cout << "double Add(double left, double right)" << endl;
return left + right;
}
// 2、参数个数不同
void f()
{
cout << "f()" << endl;
}
void f(int a)
{
cout << "f(int a)" << endl;
}
// 3、参数类型顺序不同
void f(int a, char b)
{
cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
cout << "f(char b, int a)" << endl;
}
由于构成函数重载的同名函数的参数有所不同,编译器就可以根据调用时传入的参数来确定调用的具体是哪个函数。
但是,如果两个同名函数只有返回值不同,而参数完全相同,那么操作系统就无法根据调用时传入的参数来确定调用的具体是哪个函数。
// 返回值不同不能作为重载条件,因为调⽤时也⽆法区分
void fxx()
{}
int fxx()
{
return 0;
}
在使用重载函数时,要谨慎使用缺省参数,如下面这种情况:
// 下⾯两个函数构成重载
// f()但是调⽤时,会报错,存在歧义,编译器不知道调⽤谁
void f1()
{
cout << "f()" << endl;
}
void f1(int a = 10)
{
cout << "f(int a)" << endl;
}
2.2 作用
可以利用函数重载,将多个函数当作一个可根据参数自动做出调整的函数。
例如加法函数,在c语言中,针对不同类型的数据,我们需要调用不同的加法函数:
int Add_int(int x, int y)
{
return x + y;
}
double Add_double(double x, double y)
{
return x + y;
}
int main()
{
cout << Add_int(10, 20) << endl;
cout << Add_double(10.1, 20.2) << endl;
return 0;
}
但是在C++中,利用函数重载,就可以使得Add函数变得更加灵活:
int Add(int x, int y)
{
return x + y;
}
double Add(double x, double y)
{
return x + y;
}
int main()
{
cout << Add(10, 20) << endl;
cout << Add(10.1, 20.2) << endl;
return 0;
}