模板在C++中的应用
2019-09-19赵娟
赵娟
摘要:本文主要介绍C++中参数化程序设计类型——模版,分别从函数模版和类模版两个方面介绍了模版的使用,通过实例加以比较,得出模版是一种通用性强、重用性高的类型。
关键词:C++;模版;参数化程序设计;重用
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2019)20-0296-02
开放科学(资源服务)标识码(OSID):
Abstract: This paper mainly introduces the parameterization programming type in C++:template, which introduces the use of templates from two aspects: function template and class template. By comparison with examples, the template is a type with high versatility and high reusability.
Key words: C ++; template; parameterized programming; reuse
1 引言
C++語言的继承性和多态性的目的就是实现代码的重用,为了实现代码重用,C++引入了标准模板库STL,使用STL使得程序尽可能地通用,STL的核心就是模板,如容器、算法等都是模板。
模板是一种通用的程序设计,是C++提供的一种参数化程序设计类型。通常我们想要比较不同数据类型的时候不得不定义两种不同的函数来表示区分,为了能精简代码和避免强类型的严格性和灵活性的冲突,我们就需要用到模板去改善这种情况。
C++模版分为两类:函数模版和类模版。函数模版是一类函数的抽象,它的形参可以是任意类型,使用同一函数模版可以实现不同数据类型数据的同一操作。类模版为用户定义了一种模式,是提高C++编程效率的一种方法。和普通类相比,类模板的特点是类中的某些成员数据的类型,某些成员函数的形参、返回值能取任意类型,包括基本数据类型和自定义类型。
2 函数模板
函数模版是函数重载的简化,函数重载是用两个或两个以上的函数对不同数据类型数据或者不同个数的数据完成相同的操作,而函数模版是用一个函数对不同数据类型数据完成相同的操作,重载的过程留给编译器在编译阶段实现,进而简化程序。
2.1 函数模板实例
此例是用来计算任意类型数的绝对值。该函数模板就为程序员提供了一个计算绝对值的算法,程序员只需要在使用时赋予具体的实参,编译器会根据实参的类型推导出函数模板的形参类型。例如,对于调用表达式a(-2),由于实参-2为int型,所以推导出模板中类型参数T为int。当形参类型确定后,编译器将以函数模板为样板,生成一个函数:int a(int x) {return x>0?x:-x; },因此,函数模板是函数重载的简化,可以使函数体保持不变。
2.2 函数模板在冒泡排序算法上的应用
使用函数模板的冒泡排序可适用于任何含有n个元素的一维数组中,数组中元素类型T可取整型,实型,甚至是自定义类型。若在冒泡排序时不使用函数模板则会变成下列情况:
此时的冒泡排序只能适用于n个int型数据,其他类型数据则无法使用。
3 类模板
类模板的抽象层次比类高,它是对不同类的公共性质的抽象,而类是对一组对象的公共性质的抽象。类模板为用户提供了一种定义类的模式,使得类中的某些成员数据的类型,某些成员函数的形参、返回值可以是任意类型,包括基本数据类型和自定义数据类型。
3.1 类模板在堆栈的应用
在堆栈中使用类模板,使得类模板的数据成员list数组的成员可以是任意类型。函数成员Push的形参、Pop的返回值也可以是任意类型。让堆栈这种数据结构在使用的时候不拘泥于数据类型的限制,算法的重用性更高了。
3.2 类模板中函数成员的定义
以上例的堆栈类模板为例,由于类模板的成员函数操作的数据成员的数据类型不确定,导致了类模板的函数成员一定是模板函数,所以类模板的成员函数的定义也要按照模板函数的要求去定义。
3.3类模板中对象的定义
由于类模板中成员数据的数据类型不确定,所以对象的成员数据类型也不确定,因此在定义对象时,首先要确定对象的成员数据的类型,即类模板成员数据的类型。
4结论
通过上述举例,我们发现C++中的模板是一种灵活性强,可重用性高,可扩展性强的泛型程序设计机制。使用模板可以大大减少开发时间,可以把用同一个算法适用于不同类型数据,只需在编译时确定具体的数据类型则可。从多态的角度考虑,模版模拟多态要比C++类继承实现多态效率要高, 无虚函数, 无继承。
参考文献:
[1] 郑莉,董渊,何江舟.C++语言程序设计(第4版)[M]. 北京;清华大学出版社,2014.
[2] 赵海廷. C++语言的模板及其应用[J]. 武汉工程职业技术学院学报,2004.
[3] 王昌晶,薛锦云. 从C++ 模板到STL[J]. 江西师范大学学报(自然科学版),2004.
[4] 霍有亮. 基于C++的模板与重用[J]. 西北大学学报(自然科学版),1998.
[5] 王波. C++语言中的模板应用[J]. 微型机与应用,2003.
[6] 朱素英. C++语言中模板应用研究[J]. 娄底师专学报,2004.
【通联编辑:梁书】