C++面向对象程序设计教程(二版)讲稿
第6章模板(书P222)
一、模板的慨念
C++的一个重要特性是支持重用的类属机制。类型、变量、函数均可以参数化。
模板是C++支持参数化多态性的工具。所谓参数化多态性,即是将一段程序所处理的对象的类型参数化。这样,这段程序就可以处理某个类型范围之内的各种类型的对象。这些类型呈现某种共同结构。
由于C++程序结构的主要构件是类和函数,所以模板在C++中有函数模板和类模板。它们分别允许用户构造模板函数和模板类。函数模板具体使用时要以具体类型实例化函数。实例化即用具体类型替代它,实例化后称为模板函数。同理,类模板经过实例化后称为模板类。
模板
(函数模板和类模板)
实例化实例化
模板类
模板函数
实例化
对象
C++ 6章_P1
二、函数模板与模板函数
1、引入
考察下面求绝对值重载函数声明:
int abs( int x ) //适用于整型
{
return ( x < 0 ) ? –x : x ;
}
或
double abs( double x ) //适用于双精度型
{
return ( x < 0 ) ? –x : x ;
}
函数abs( )被重载用于求整型(int)和双精度(double)
浮点数求绝对值。这些函数的参数个数,函数执行功能相同,即实现代码也相同。由于参数类型不同要重写,浪费许多重复劳动。如果将int和double类型参数化,就可以得到通用的求绝对值代码段:
Template < class T >
T abs( T x )
{
return ( x < 0 ) ? –x : x ;
}
C++ 6章_P2
这样当需要求某整数或双精度数绝对值时,只需将T用int或double替换即可。还可以计算其它类型的绝对值。
这种类型参数化避免了程序员大量的重复劳动,增加程序的灵活性。
2、函数模板定义的一般格式:
Template < class 类型参数>
返回值类型函数名( 模板形参表)
{
函数体
}
其中,Template是一个声明模板的关键字,表示声明一个模板。例如,书P223求最大值函数max()定义成函数模板:
Template < class T >
T max( T x, T y )
{
return ( x > y ? x : y );
}
也可写成:
Template < typename T >
T max( T x, T y )
{
return ( x > y ? x : y );
}
C++ 6章_P3
其中,T为类型参数,它既可取系统预定义的数据类型,又可以是用户自定义的类型。而T前加关键字class
(或 typename)标志T是类型参数类型。
类型参数T必须实例化,即用实际的数据类型替代它。
(书P224)
#include <> //输入输出流头文件
#include <> //字符串头文件
template < class AT > //类型参数 AT
AT max( AT x , AT y )
{ return ( x > y ) ? x : y ; }
main() //主函数
{
int i1 = 10 , i2 = 56; //定义三个整型变量
float f1 = , f2 = ;
double d1 = , d2 = ;
char c1 = 'k' , c2 = 'n' ;
cout << "the max of i1 , i2 is: " << max( i1 , i2 ) << endl ;
//用 int 实例化类型参数 AT
cout << "the max of f1 , f2 is: " << max( f1 , f2 ) << endl ;
//用 float 实例化类型参数 AT
cout << "the max of d1 , d2 is: " << max( d1 , d2 ) << endl ;
//用 double 实例化类型参数 AT
cout << "the max of c1 , c2 is: " << max( c1 , c2 ) << endl ;
//用 char 实例化类型参数 AT
return 0 ;
}
例6_1_1
C++ 6章_P4
程序的运行结果为:
the max of
C Cha6 来自淘豆网www.taodocs.com转载请标明出处.