联系方式:北京源智天下科技有限公司第十九讲:模板与C++标准库杨章伟e-mail:jtclass@163.com1-2北京源智天下科技有限公司联系方式:课程内容安排•模板概述•函数模板•类模板•C++标准库概述•字符串库•综合练习•思考和习题1-3北京源智天下科技有限公司联系方式:模板概述•C++模板是近几年来对C++的一种扩展,模板是根据类型参数来产生函数和类的机制,有时也称模板为“参数化的类型”。使用模板,可以设计一个对许多类型的数据进行操作的类,而不需要为每个类型的数据建立一个单独的类。•简单的说,模板是实现代码复用的一种工具,它可以实现类型参数化,把类型定义为参数,实现代码的真正复用。1-4北京源智天下科技有限公司联系方式:模板的引入•该范例使用了模板来实现多个数据类型的求最大最小值,实现功能如图所示。1-5北京源智天下科技有限公司联系方式:代码清单•1#includeiostream.h//包含输入输出头文件•2templatetypenameT//定义模板•3constT&min(constT&t1,constT&t2)•4{•5returnt1t2?t2:t1;//返回较小值•6}•7templatetypenameT//定义模板•8constT&max(constT&t1,constT&t2)•9{•10returnt1t2?t1:t2;//返回较大值•11}•12voidmain()•13{•14inta,b;//定义整型变量•15intmn,mx;•16coutPleaseinput2numbers:endl;•17cinab;//接收用户输入•18mn=min(a,b);//调用函数•19coutTheMinis:mnendl;•20mx=max(a,b);//调用函数•21coutTheMaxis:mxendl;•22}1-6北京源智天下科技有限公司联系方式:函数模板•简单的说,模板分两类:函数模板和类模板,用户可使用他们来构造模板函数或模板类。模板经过实例化后就得到模板函数或模板类,模板函数或模板类再经过实例化后就得到对象。1-7北京源智天下科技有限公司联系方式:定义函数模板•函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计,其最大特点是把函数使用的数据类型作为参数。一般来说,函数模板的定义形式为:•templatetypename数据类型参数标识符•返回类型函数名(参数表)•{•函数体•}•其中,template是定义模板函数的关键字,template后面的尖括号不能省略;typename是声明数据类型参数标识符的关键字,用以说明它后面的标识符是数据类型标识符。1-8北京源智天下科技有限公司联系方式:定义函数模板•例如,下面定义了一个函数模板。•templatetypenameT•Tfuc(Tx,inty)•{•Tx;•//……•}•此外,关键字typename也可以使用关键字class,这时数据类型参数标识符就可以使用所有的C++数据类型。1-9北京源智天下科技有限公司联系方式:生成模板函数函数模板只是一个模板,并不是真正的函数。函数模板的数据类型参数标识符实际上是一个类型形参,在使用函数模板时,要将这个形参实例化为确定的数据类型。将类型形参实例化的参数称为模板实参,用模板实参实例化的函数称为模板函数。模板函数的生成就是将函数模板的类型形参实例化的过程。简单的说,在主程序中将函数模板实例化为某种特定数据类型之间的比较,即生成了该类型的模板函数。1-10北京源智天下科技有限公司联系方式:类模板类模板也称为类属类或类生成类,是为类定义的一种模式,其使类中的一些数据成员和成员函数的参数或返回值可以取任意的数据类型。类模板是一个具体的类,其代表着一族类,是这一族类的统一模式,使用类模板就是要将它实例化为具体的类。一般来说,定义类模板的一般形式为:templateclass数据类型参数标识符class类名{//……}1-11北京源智天下科技有限公司联系方式:模板类与模板函数的生成相似的,将类模板的模板参数实例化后生成的具体的类,就是模板类。由类模板生成模板类的一般形式为:类名数据类型参数标识符对象名1,对象名2,…,对象名n;此处的数据类型参数标识符对应的是对象实际需要的数据类型。1-12北京源智天下科技有限公司联系方式:标准库概述一般来说,C++标准可分为两部分:C++语言本身和C++标准库,C++标准库实现容器和算法的部分就是STL。C++标准库很大,在现在的情况下,C++标准库确实越来越好,因为大的库会包含大量的功能。标准库中的功能越多,开发自己的应用程序时能借助的功能就越多。1-13北京源智天下科技有限公司联系方式:标准库的组成简单的说,C++标准函数库为C++程序员们提供了一个可扩展的基础性框架,用户从中可以获得极大的便利,同时也可以通过继承现有类,自己编制符合接口规范的容器、算法、迭代子等方式对之进行扩展。简单的说,C++标准库大致包含了如下几个组件:1-14北京源智天下科技有限公司联系方式:北京源智天下科技有限公司联系方式:综合练习•该实例通过函数模板的声明和模板函数的生成,实现不同数据类型数值的交换。1-16北京源智天下科技有限公司联系方式:包含输入输出头文件2templatetypenameT//声明模板函数,T为数据类型参数标识符3voidswap(T&x,T&y)//定义模板函数4{5Tz;//变量z可取任意数据类型及模板参数类型T6z=y;//交换两个变量的值7y=x;8x=z;//交换完成9}10voidmain()//主函数11{12intm=1,n=5;//定义整型变量并初始化13doublea=8.9,b=3.4;//定义双精度变量并初始化14coutm=mn=nendl;//未交换前输出结果15couta=ab=bendl;//未交换前输出结果16swap(m,n);//实例化为整型模板函数17swap(a,b);//实例化为双精度型模板函数18coutm与a,n与b交换以后:endl;//输出提示19coutm=mn=nendl;//交换后输出结果20couta=ab=bendl;//交换后输出结果21}1-17北京源智天下科技有限公司联系方式:思考和习题•在C++中为什么要引入模板的概念?其有什么优点?•函数模板和类模板分别在应用程序中如何使用?•C++标准库是指什么?•字符串库中定义了哪些常用的字符串操作?•设计一个类模板,实现对任意类型数据的存取。