C++程序设计 第13章 模板_第1页
C++程序设计 第13章 模板_第2页
C++程序设计 第13章 模板_第3页
C++程序设计 第13章 模板_第4页
C++程序设计 第13章 模板_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第十三章第十三章 模板模板 模板把函数或类要处理的数据类型参数化,表现为参数的多态模板把函数或类要处理的数据类型参数化,表现为参数的多态 性,称为类属。性,称为类属。 模板用于表达逻辑结构相同,但具体数据元素类型不同的数据模板用于表达逻辑结构相同,但具体数据元素类型不同的数据 对象的通用行为。对象的通用行为。主要内容n什么是模板n函数模板n类模板13.1 13.1 什么是模板什么是模板类属类属 类型参数化,又称参数模板类型参数化,又称参数模板 使得程序(算法)可以从逻辑功能上抽象,把被处理的对象(数据)类型作为参数传递C+提供两种模板机制:函数模板函数模板类模板类模板13.1 13.1 什么是

2、模板什么是模板模板(函数模板和类模板)模板函数模板类对象13.2 13.2 函数模板函数模板 考虑求两参数之中大值函数:max ( a , b )对 a , b 的不同类型,都有相同的处理形式:return ( a b ) ? a : b ;用已有方法解决对不同数据类型处理:(1)宏替换# define max ( a , b ) ( a b ? a : b )问题问题 避开类型检查(2)重载问题问题 需要许多重载版本(3)使用函数模板使用函数模板13.2 13.2 函数模板函数模板 重载函数通常基于不同的数据类型实现类似的操作重载函数通常基于不同的数据类型实现类似的操作 对不同数据类型的操作

3、完全相同,用函数模板实现更为简洁方便对不同数据类型的操作完全相同,用函数模板实现更为简洁方便template 声明模板中使用的类属参数。形式为 13.2.1 13.2.1 模板说明模板说明template 声明模板中使用的类属参数。形式为 关键字关键字13.2.1 13.2.1 模板说明模板说明template 类型形式参数的形式为:typename T1 , typename T2 , , typename Tn 或class T1 , class T2 , , class Tn 声明模板中使用的类属参数。形式为 13.2.1 13.2.1 模板说明模板说明类型形式参数的形式为:typena

4、me T1 , typename T2 , , typename Tn 或class T1 , class T2 , , class Tn template 声明模板中使用的类属参数。形式为 关键字关键字13.2.1 13.2.1 模板说明模板说明类型形式参数的形式为:typename T1 , typename T2 , , typename Tn 或class T1 , class T2 , , class Tn template 声明模板中使用的类属参数。形式为 类属参数类属参数13.2.1 13.2.1 模板说明模板说明template template template templa

5、te 声明模板中使用的类属参数。形式为 例如例如13.2.1 13.2.1 模板说明模板说明template 类型类型 函数名函数名 ( 形式参数表形式参数表 ) 语句序列语句序列 函数模板声明函数模板声明 函数模板定义由模板说明和函数定义组成函数模板定义由模板说明和函数定义组成 模板说明的类属参数必须在函数定义中至少出现一次模板说明的类属参数必须在函数定义中至少出现一次 函数参数表中可以使用类属类型参数,也可以使用一般类型参数函数参数表中可以使用类属类型参数,也可以使用一般类型参数 13.2.2 13.2.2 函数模板与模板函数函数模板与模板函数#include template T max

6、 ( T a , T b ) return a b ? a : b ; void main ( ) cout max ( 3 , 5 ) is max ( 3 , 5 ) endl ; cout max ( y , e ) is max ( y , e ) endl ; cout max ( 9.3 , 0.5 ) is max ( 9.3 , 0.5 ) endl ;例例13-1 简单函数模板应用简单函数模板应用#include void main ( ) cout max ( 3 , 5 ) is max ( 3 , 5 ) endl ; cout max ( y , e ) is max

7、 ( y , e ) endl ; cout max ( 9.3 , 0.5 ) is max ( 9.3 , 0.5 ) b ? a : b ; char max ( char a , char b ) return a b ? a : b ; double max ( double a , double b ) return a b ? a : b ; 编译器生成的编译器生成的模板函数模板函数程序执行时程序执行时匹配不同的版本匹配不同的版本例例13-1 简单函数模板应用简单函数模板应用template void SortBubble ( ElementType *a , int size

8、) int i, work ; ElementType temp ; for (int pass = 1; pass size; pass + ) work = 1; for ( i = 0; i ai+1 ) temp = ai ; ai = ai+1 ; ai+1 = temp ; work = 0 ; if ( work ) break ; 例例13-2 13-2 冒泡排序法的函数模板冒泡排序法的函数模板 #include iostreamusing namespace std;template void SortBubble ( ElementType *a , int size )

9、int i, work ; ElementType temp ; for (int pass = 1; pass size; pass + ) work = 1; for ( i = 0; i ai+1 ) temp = ai ; ai = ai+1 ; ai+1 = temp ; work = 0 ; if ( work ) break ; void main()int *p;int a10=2,43,2,5,3,6,3,5,2,6;p=a;SortBubble (p,10);for(int i=0;i=9;i+)coutain;有些特殊情况需要函数模板参与重载例如例如template T

10、max ( T a , T b ) return a b ? a : b ; void f ( int i , char c ) max ( i , i ) ;/ ok max ( c , c ) ;/ ok max ( i , c ) ;/ error,无法匹配 max ( c , i ) ;/ error 模板类型不能提供模板类型不能提供类型的隐式转换类型的隐式转换13.2.3 13.2.3 重载函数模板重载函数模板template T max ( T a , T b ) return a b ? a : b ; max ( a , b )/ 模板函数重载版本模板函数重载版本 return

11、 a b ? a : b ; void f ( int i , char c ) max ( i , i ) ;/ ok max ( c , c ) ;/ ok / ok ,由系统提供隐式转换由系统提供隐式转换 / ok 13.2.3 13.2.3 重载函数模板重载函数模板#include #include template T Max( const T a, const T b ) return ab ? a : b ; template T Max( const T a, const T b , const T c) T t ; t = Max(a, b) ; return Max ( t

12、, c ) ; int Max( const int a , const char b ) return ab ? a : b ; void main ( ) cout Max( 3, a ) is Max( 3, a ) endl ; cout Max(9.3, 0.5) is Max(9.3, 0.5) endl ; cout Max(9, 5, 23) is Max(9, 5, 23) endl ; template T Max( const T a, const T b , const T c) T t ; t = Max(a, b) ; return Max ( t, c ) ; 用

13、普通函数用普通函数重载函数模板重载函数模板int Max( const int a , const char b ) return ab ? a : b ; template T Max( const T a, const T b ) return ab ? a : b ; 例例13-3 13-3 重载函数模板示例重载函数模板示例#include #include template T Max( const T a, const T b ) return ab ? a : b ; template T Max( const T a, const T b , const T c) T t ; t

14、 = Max(a, b) ; return Max ( t, c ) ; int Max( const int a , const char b ) return ab ? a : b ; void main ( ) cout Max( 3, a ) is Max( 3, a ) endl ; cout Max(9.3, 0.5) is Max(9.3, 0.5) endl ; cout Max(9, 5, 23) is Max(9, 5, 23) endl ; 例例13-3 13-3 重载函数模板示例重载函数模板示例 类模板用于实现类所需数据的类型参数化类模板用于实现类所需数据的类型参数化

15、类模板在表示如数组、表、图等数据结构显得特别重要,类模板在表示如数组、表、图等数据结构显得特别重要, 这些数据结构的表示和算法不受所包含的元素类型的影响这些数据结构的表示和算法不受所包含的元素类型的影响类模板由模板说明和类说明构成类模板由模板说明和类说明构成 template 类声明例如例如 templateclass TClass / TClass的成员函数 private : Type DateMember ; /;类属参数必须类属参数必须至少至少在类说明中出现一次在类说明中出现一次 13.3.1 13.3.1 类模板与模板类类模板与模板类templateclass Array publi

16、c : Array ( int s ) ; virtual Array () ; virtual const T& Entry( int index ) const ; virtual void Enter( int index, const T & value ) ; protected : int size ; T * element ; ;template Array:Array(int s) if ( s 1 ) size = s ; else size = 1 ; element = new T size ; template Array : Array() dele

17、te element ; template const T& Array : Entry ( int index ) const return element index ; template void Array : Enter(int index, const T& value) element index = value ; 例例13-4 一个数组类模板一个数组类模板 templateclass Array public : Array ( int s ) ; virtual Array () ; virtual const T& Entry( int index

18、 ) const ; virtual void Enter( int index, const T & value ) ; protected : int size ; T * element ; ;template Array:Array(int s) if ( s 1 ) size = s ; else size = 1 ; element = new T size ; template Array : Array() delete element ; template const T& Array : Entry ( int index ) const return el

19、ement index ; template void Array : Enter(int index, const T& value) element index = value ; #include #include Array.hvoid main() Array IntAry( 5 ) ; int i ; for ( i = 0; i 5; i + ) IntAry.Enter ( i, i ) ; cout Integer Array : n ; for ( i = 0; i 5; i + ) cout IntAry.Entry(i) t ; coutendl ; Array

20、 DouAry( 5 ) ; for ( i = 0; i 5; i + ) DouAry.Enter ( i, (i+1)*0.35 ) ; cout Double Array : n ; for ( i = 0; i 5; i + ) cout DouAry.Entry(i) t ; coutendl;例例13-4 一个数组类模板一个数组类模板 在类模板中可以声明各种友员关系在类模板中可以声明各种友员关系 一个函数或函数模板可以是类或类模板的友员一个函数或函数模板可以是类或类模板的友员 一个类或类模板可以是类或类模板的友员类一个类或类模板可以是类或类模板的友员类 声明这种模板之间的友员关系

21、符号比较烦琐声明这种模板之间的友员关系符号比较烦琐13.3.4 13.3.4 类模板与友员类模板与友员#includetemplateclass Complex public: Complex( T r =0, T i =0 ); Complex(T a) Real = a ; Image = 0 ; void print() const; friend Complex operator+ ( const Complex & c1, const Complex & c2 ); friend Complex operator- ( const Complex & c1,

22、const Complex & c2 ); friend Complex operator- ( const Complex & c ); private: T Real, Image ;void main() Complex c1( 2.5,3.7 ), c2( 4.2, 6.5 ) ; Complex c ; c = c1 - c2 ; c.print() ; c = c2 + c2 ; c.print() ; c = - c1 ; c.print() ;例例13-5 为复数类模板用定义重为复数类模板用定义重载运算符友员函数载运算符友员函数#includetemplatec

23、lass Complex public: Complex( T r =0, T i =0 ); Complex(T a) Real = a ; Image = 0 ; void print() const; friend Complex operator+ ( const Complex & c1, const Complex & c2 ); friend Complex operator- ( const Complex & c1, const Complex & c2 ); friend Complex operator- ( const Complex &

24、amp; c ); private: T Real, Image ;void main() Complex c1( 2.5,3.7 ), c2( 4.2, 6.5 ) ; Complex c ; c = c1 - c2 ; c.print() ; c = c2 + c2 ; c.print() ; c = - c1 ; c.print() ;例例13-5 为复数类模板用定义重为复数类模板用定义重载运算符友员函数载运算符友员函数template Complex:Complex( T r, T i ) Real = r ; Image = i ; template Complex operator

25、 +( const Complex & c1, const Complex & c2 ) T r = c1.Real + c2.Real ; T i = c1.Image+c2.Image ; return Complex( r, i ) ;template Complex operator - ( const Complex & c1, const Complex & c2 ) T r = c1.Real - c2.Real ; T i = c1.Image - c2.Image ; return Complex( r, i ) ;templateComple

26、x operator- ( const Complex & c ) return Complex( -c.Real, -c.Image ); template void Complex:print()const cout ( Real , Image ) endl; 例例13-5 为复数类模板用定义重为复数类模板用定义重载运算符友员函数载运算符友员函数template Complex:Complex( T r, T i ) Real = r ; Image = i ; template Complex operator +( const Complex & c1, const Complex & c2 ) T r = c1.Real + c2.Real ; T i = c1.Image+c2.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论