欢迎来到天天文库
浏览记录
ID:17757843
大小:234.00 KB
页数:31页
时间:2018-09-05
《第20章模板-模板引子课件》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第20章模板模板引子1.假如设计一个求两参数最大值的函数,在实践中我们可能需要定义四个函数:intmax(inta,intb){return(a>b)?a,b;}longmax(longa,longb){return(a>b)?a,b;}doublemax(doublea,doubleb){return(a>b)?a,b;}charmax(chara,charb){return(a>b)?a,b;}2.这些函数几乎相同,唯一的区别就是形参类型不同3.需要事先知道有哪些类型会使用这些函数,对于未知类型这些函数不起作用模板的概念所谓模板是一种使用无类型参数来产生一系列函数或类的机制。若一个程
2、序的功能是对某种特定的数据类型进行处理,则可以将所处理的数据类型说明为参数,以便在其他数据类型的情况下使用,这就是模板的由来。模板是以一种完全通用的方法来设计函数或类而不必预先说明将被使用的每个对象的类型。通过模板可以产生类或函数的集合,使它们操作不同的数据类型,从而避免需要为每一种数据类型产生一个单独的类或函数。模板分类函数模板(functiontemplate)是独立于类型的函数可产生函数的特定版本类模板(classtemplate)跟类相关的模板,如vector可产生类对特定类型的版本,如vector4例子:求最大值模板函数实现1.求两个数最大值,使用模板template
3、Tmax(Ta,Tb){return(a>b)?a,b;}2.template<模板形参表><返回值类型><函数名>(模板函数形参表){//函数定义体}P441ch20_1.cpp5模板工作方式函数模板只是说明,不能直接执行,需要实例化为模板函数后才能执行在说明了一个函数模板后,当编译系统发现有一个对应的函数调用时,将根据实参中的类型来确认是否匹配函数模板中对应的形参,然后生成一个重载函数。该重载函数的定义体与函数模板的函数定义体相同,它称之为模板函数6#includetemplateTmin(Ta[],intn){inti;Tminv
4、=a[0];for(i=1;ia[i])minv=a[i];}returnminv;}编写一个对具有n个元素的数组a[]求最小值的程序,要求将求最小值的函数设计成函数模板。voidmain(){inaa[]={1,3,0,2,7,6,4,5,2};doubleb[]={1.2,-3.4,6.8,9,8};cout<<”a数组的最小值为:”<5、量不同函数名表示相似功能的坏习惯克服了宏定义不能进行参数类型检查的弊端克服了C++函数重载用相同函数名字重写几个函数的繁琐缺点,调试比较困难一般先写一个特殊版本的函数运行正确后,改成模板函数8函数重载与函数模板函数重载基于不同的数据类型(或参数个数不同)完成类似的操作函数模板基于不同的数据类型,完成相同的操作程序员对函数模板的定义只编写一次根据调用时提供的类型参数,编译器自动产生相应的目标代码和C语言中的宏一样简洁还可以让编译器进行类型检查重载模板函数P442ch20.2.cpp编译器在处理上述情况时,首先匹配重载函数,然后再寻找模板的匹配。类模板与函数模板类似,支持多种数据类型类模板的6、成员函数定义也是模板作用域解析操作符前的类名为CLASSNAME类与其成员函数的定义方式不变调用时由编译器处理类型替换的问题类模板例子templateclassPair{public:Pair();Pair(Tfirst_value,Tsecond_value);voidset_element(intposition,Tvalue);Tget_element(intposition)const;private:Tfirst;Tsecond;};templatePair::Pair(Tfirst_value,Tsecon7、d_value):first(first_value),second(second_value){//Nobodyneededduetoinitializationabove}voidPair::set_element(intposition,Tvalue){if(position==1)first=value;elseif(position==2)second=value;else…}类模板的使用Pair
5、量不同函数名表示相似功能的坏习惯克服了宏定义不能进行参数类型检查的弊端克服了C++函数重载用相同函数名字重写几个函数的繁琐缺点,调试比较困难一般先写一个特殊版本的函数运行正确后,改成模板函数8函数重载与函数模板函数重载基于不同的数据类型(或参数个数不同)完成类似的操作函数模板基于不同的数据类型,完成相同的操作程序员对函数模板的定义只编写一次根据调用时提供的类型参数,编译器自动产生相应的目标代码和C语言中的宏一样简洁还可以让编译器进行类型检查重载模板函数P442ch20.2.cpp编译器在处理上述情况时,首先匹配重载函数,然后再寻找模板的匹配。类模板与函数模板类似,支持多种数据类型类模板的
6、成员函数定义也是模板作用域解析操作符前的类名为CLASSNAME类与其成员函数的定义方式不变调用时由编译器处理类型替换的问题类模板例子templateclassPair{public:Pair();Pair(Tfirst_value,Tsecond_value);voidset_element(intposition,Tvalue);Tget_element(intposition)const;private:Tfirst;Tsecond;};templatePair::Pair(Tfirst_value,Tsecon
7、d_value):first(first_value),second(second_value){//Nobodyneededduetoinitializationabove}voidPair::set_element(intposition,Tvalue){if(position==1)first=value;elseif(position==2)second=value;else…}类模板的使用Pair
此文档下载收益归作者所有