模板与泛型编程(一)--《C++ primer》

C++ 专栏收录该内容
11 篇文章 0 订阅

模板是C++中泛型编程的基础。一个模板就是一个创建类或函数的蓝图或者说公式。

模板大体分两种:一种是函数模板,另一种是类模板。

函数模板

格式一般为:

templelate <class T>
返回类型 函数名(参数列表)
{
  函数体
}

比如可以定义比较大小的函数MAX(参数列表),在MAX(参数列表)中的参数列表,我可能想比较为int类型的两数大小,或者double类型的两数大小,那么我就可以将MAX()函数声明为函数模板,这样一来,就实现了函数的实现与其具体类型无关的代码。到了这里不免想起函数重载,于是又是一番纠结,那么下面就来讨论一下它们的异同点。

首先函数重载,他的定义可以简单说:函数有同样的名称,但是实参参数列表不相同的情形,这样的同名不同参数的函数之间,称之为重载函数。参数列表不同可以是参数的类型或者参数的个数,在后者两者都不同;它是调用是通过你的参数的个数或者类型的不同来识别的。

注意:这里说的是实参,编译器不以形参名来区分。

优点是:便于扩充方法内容,可以少写重复代码,是为了以更清晰的方式描述类的方法

缺点也是显而易见:仅函数名相同,函数体仍然要分别定义,代码重复,容易出错,增加了程序维护的工作量

比如:

int MAX(int x,int y);
int MAX(int x,int y,int z);

可以通过在主函数中通过int a=MAX(3,6);和int b=MAX(6,9,12);来分别调用以上两个函数;但是不能通过过不同的返回值来实现函数的重载,如

int MAX(x,y){
    return (x>y)?x:y;
}
float MAX(x,y){
    return (x>y)?x:y;
}

这样编译器无法识别,因为参数的个数和类型都完全一样,而返回值不同是没用的。

注意:重载函数的形参必须不能完全相同:个数不同或者类型不同。

下面再说函数模板,函数模板针对参数类型不同的函数。它的定义简单来说就是:用同一个名字定义不同的函数,这些函数功能相同,参数类型和返回类型不同。

优点:函数模板可以用来创建一个通用功能的函数,对不同类型的数据进行相同的处理,有利于代码重复使用,提高程序的开发效率。 函数模板只是对函数的描述,编译器不为其产生任何执行代码,只有当遇到函数调用时,编译器会自动将模板中的类型T用实参的类型来替换,生成一个重载函数,该重载函数称为模板函数

缺点:编译器给出的有些出错信息比较晦涩;为每种类型都生成额外的代码,可能导致生成的exe膨胀;由于template需要输出其实现,因而在大型系统中滥用可能导致构建时间极长;templates在头文件中,这样一旦有所变更需要重编译所有相关工程;没有信息隐藏等

比如:

template<typename x>    
typename fun(typename x){
    return x*x;
}  

这个模板函数要用来计算一个数字的平方。但是若要计算int型,float型,甚至char型的平方也是可以的。因为它是一个模板函数,当然也可以使用重载函数,但是由于就此题而言,仅仅是数据类型不同,写3个函数出来工作量很大,没有多大意义,所以用函数模板较好。typename是通用类型,你传的参数是什么类型,这个通用类型就变成什么类型。


总结:模板和重载都是C++多态的表现形式,C++多态分四种:虚函数多态,模板多态,重载和转换。它们既然都属于多态的表现形式就有他们的优缺点,它们相互补充相互促进,才构成了C++多态的多样化。



  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值