3. 默认参数
默认参数值的是当函数调用中可以给实参赋上一个默认值,这样函数调用时没写实参就自动使用这个默认值
默认值(只能)在函数原型中添加。如:
double fun(int n = 1);
这样fun()就等同于调用fun(1);
对于带参数列表的函数,必须从右向左添加默认值:
int fun(int a, int b = 2, int c = 3); //可以
int fun(int a, int b = 2, int c); //不可以
对int fun(int a, int b = 2, int c = 3);来说
fun(2) 等同于fun(2, 2, 3);
fun(1,8) 等同于fun(1, 8 ,3);
fun(8, 7 ,6)就是fun(8,7,6); 没有使用默认值
4. 函数重载
函数重载又叫函数多态,指的是可以用多个同名的函数来使用不同的参数列表,例如:
void print(const char * str, int width);
void print(double d, int width);
void print(long l, int width);
void print(int i, int width);
void print(const char * str);
这里要引入一个概念: 函数特征标:如果两个函数的参数数目和类型相同,同时参数的排列顺序也相同,则它们的特征标相同,而变量名是无关紧要的;如果上述几个条件一个不满足,则函数特征标就不同。C++的函数重载就指允许定义名称相同的函数,条件是他们的特征标不同
注意函数重载返回值必须相同!
5. 函数模板
函数模板是通用的函数描述,也就是说,它使用泛型来定义函数,其中的泛型可用具体的类型(如int或double)替换。具体怎么用举个例子先:
template <typename AnyType>
void fun(AnyType &a, AnyType &b)
{
AnyType temp;
temp = a;
a = b;
b = temp;
}
重要的是第一行,关键字template和typename是必须的,这是定义一个泛型,泛型的名字叫AnyType,也可以叫其他名字,。余下这个函数模板描述了交换两个AnyType的算法。如果a和b都是int,那么anytype自动变成int
泛型可以和普通类型一起使用,如
template <typename AnyType>
void fun(AnyType &a, AnyType &b, int c)
{
.......
} 这是允许的
泛型可以是结构,但上例中a和b是结构的话,显然程序就会出错,解决方法是运用函数重载声明一个针对结构的对应函数。比如上面的fun可以这样重载
void fun(struct & st21, struct & str2);// 非模板函数,针对结构
template <typename AnyType>
void fun(AnyType &a, AnyType &b); //模板函数原型,使用泛型
template<> fun<struct>(struct &str1, struct &str2);//显示具体化,针对结构
具体化优先于常规模板,而非模板函数优先于具提化和常规函数,也就是程序遇到了一个fun的调用,先看里面的参数符不符合非模板函数(如果有的话),如果不符合,再看具体化符不符合,最后才看泛型模板函数