C++ 模板简介
例3 重载函数模板示例
template <typename T> T Max( const T a, const T b ) { return a>b ? a : b ; } T Max( const T a, const T b ) { return a>b ? a : b ; } template <typename T> 重载函数模板 T Max( const T a, const T b , const T c) { T t ; t = Max(a, b) ; return Max ( t, c ) ; } int Max( const int a , const char b ) {{return a>b ? a ::b ;;}} return a>b ? a b
6.1
模板概述
模板是支持参数化程序设计的工具, 模板是支持参数化程序设计的工具, 实现参数的多态性 实现参数的多态性
将程序要处理的对象的类型参数化, 使程序可以处理不同类型的对象;
C++提供两种模板机制: C++提供两种模板机制:
•函数模板 函数模板 •类模板 类模板
6.2
函数模板
考虑求两参数之中大值函数: 考虑求两参数之中大值函数:max ( a , b ) 的不同类型,都有相同的处理形式: 对 a , b 的不同类型,都有相同的处理形式:
对不同数据类型的操作完全相同, template 实现更为简洁方便; 用函数模板实现更为简洁方便 < typename T > T max ( T a , T b ) { return a > b ? a : b ; } C++提供的函数模板可定义一个对任何类型变量进 提供的函数模板可定义一个对任何类型变量进 提供的函数模板可定义一个对任何 行操作的函数,从而大大增强了函数设计的通用 行操作的函数,从而大大增强了函数设计的通用 性。
{ return a > b ? a : b ; }
{ cout << " max ( 3 , 5 ) is " << max ( 3 , 5 ) << endl ; cout << " max ( 'y' , 'e' ) is " << max ( 'y' , 'e' ) << endl ; cout << " }
函数模板作业
1. 用函数模板方式设计一个函数模板 用函数模板方式设计一个函数模板sort<T>, , 采用插入排序方式对数据进行排序 可对整数序列、字符序列进行排序。 可对整数序列、字符序列进行排序。 可对盒子数组、 可对盒子数组、字符串数组进行排序。 2.设计函数模板实现折半查找算法 设计函数模板实现折半查找算法binSearch<T> 设计函数模板实现折半查找算法 在大小为n的数组 中查找值为Key的元素 的数组arr中查找值为 在大小为 的数组 中查找值为 的元素 返回查找结果(找到为下标,没找到-1) 返回查找结果(找到为下标,没找到 ) int binSearch( T arr[], int n, T key)
template < typename T > T max ( T a[] , int n )
例1 简单函数模板应用
#include <iostream.h> template < typename T > T max ( T a , T b ) { return a > b ? a : b ; } void main ( )
6.2.2
函数模板定义
template < typename T > T max ( T a , T b ) { return a > b ? a : b ; }
template < 类型形式参数表 >
类型 函数名 ( 形式参数表 )
{
语句序列
}
函数模板定义由模板说明和函数定义组成。 模板说明的类型参数必须在函数首部中至少出现一次 函数参数表中也可以使用一般类型参数. 函数参数表中也可以使用一般类型参数
函数模板作业
排序法的函数模板
template <typename T > void Sort ( T *a , int size ) { T temp ; ….. void Sort ( int *array , int size ); //Sort<int> } void Sort ( double *array , int size ); //Sort<double> void Sort ( char * carray , int size ); //Sort<char> void Sort ( char *name[] , int size ); //Sort<char*> void Sort ( string * name , int size ); //Sort<string*> void Sort ( Box *boxes , int size ); //Sort<Box>
程序执行时 max ( 9.3 , 0.5 匹配不同的版本
) is " << max ( 9.3 , 0.5 ) << endl ;
6.2.3 函数模板参数匹配
类型实参与类型形参必须严格匹配
template < typename T > T max ( T a , T b ) { return a > b ? a : b ; } int max ( int a , int b ) { return a > b ? a : b ; } max ( i1 , 显式指定模板类型参数 max<int> i 2) ; // max ( c1 , c2 ) ; 可以实现类型转换// max<char> max ( i , c ) ‘a’); max<int>(3, ; max<float>(f, d); max ( f , d ) ; max( str1, str2); max (b1, b2); // error // error // char str1[10],str2[10] //Box b1, b2;
函数模板
return ( a > b ) ? a : b ;
int max ( int a , int b ); int max (char a[], char b[]); ……. Box max (Box a , Box b );
重载函数通常基于不同的 重载函数通常基于不同的 数据类型实现类似操作 数据类型实现类似操作; 类似操作
return ( a > b ) ? a : b ;
用已有方法解决对不同数据类型处理: 用已有方法解决对不同数据类型处理: (1)宏替换 )
问题
(2)重载 )
# define max ( a , b ) ( a > b ? a : b) ) 避开类型检查
问题 需要许多重载版本
(3)使用函数模板 )
6.2
类模板
类型为T的数组数据 类型为 的数组数据
类定义
int类型数组 类型数组
类定义
string类型数组 类型数组
类定义
Box类型数组 类型数组
类定义
Employee*类型数组 类型数组
//安全整形数组 安全整形数组 class Array { public : Array ( int s ) ; ~ Array ( ) ; int& get ( int index); void set ( int index, int& value); int& operator[ ] (int index) ; Array& operator = (Array& rArr) ; friend ostream& operator<<(ostream& out, Array& a); protected : int size ; int * element ; };
6.2.1 模板说明
template < typename T > T max ( T a , T b ) { return a > b ? a : b ; }
声明模板中使用的类型参数。形式: 声明模板中使用的类型参数。形式: 类型参数 template < 类型形式参数表 >
类型形式参数的形式为:
模板类型不能提供 类型的隐式转换
6.2.4 重载函数模板
寻找和使用最符合函数名和参数类型的函数; 寻找和使用最符合函数名和参数类型的函数; 寻找一个函数模板, 寻找一个函数模板,将其实例化产生一个匹 配的模板函数,若找到则调用它; 配的模板函数,若找到则调用它; 寻找可以通过类型转换进行参数匹配的函数; 寻找可以通过类型转换进行参数匹配的函数; 如果按以上步骤均未能找到匹配函数, 如果按以上步骤均未能找到匹配函数, 则调用错误。 则调用错误。 如果调用有多于一个的匹配选择, 如果调用有多于一个的匹配选择, 则调用匹配出现二义性。 则调用匹配出现二义性。
用普通函数
void main ( ) { Max(9.3, 0.5); Max(9, 5, 23) ; Max(‘a’,’b’,’c’); Max(1, ‘1’); Max(“lelele”,”hahaha”); }
重载函数模板
数模板练习
编写交换两个数据的函数模板