第八章 函数探幽(2)

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的调用,先看里面的参数符不符合非模板函数(如果有的话),如果不符合,再看具体化符不符合,最后才看泛型模板函数



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值