第9章--模板

来源:互联网 发布:混沌战域神兵进阶数据 编辑:程序博客网 时间:2024/05/20 06:07

函数模板+类模板
一、
函数模板:
1. 函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计。
2. 定义方法:
template <模板参数表>
3. 函数定义
模板参数表的内容
类型参数:class(或typename) 标识符
常量参数:类型说明符 标识符
模板参数:template <参数表> class 标识符

例:求绝对值函数的模板

#include <iostream>using namespace std;template<typename T>T abs(T x) {    return x < 0? -x : x;}int main() {    int n = -5;    double d = -5.5;    cout << abs(n) << endl;    cout << abs(d) << endl;    return 0;

分析:
编译器从调用abs()时实参的类型,推导出函数模板的类型参数。例如,对于调用表达式abs(n),由于实参n为int型,所以推导出模板中类型参数T为int。

当类型参数的含义确定后,编译器将以函数模板为样板,生成一个函数: int abs(int x) { return x < 0 ? –x : x; }

二、
类模板:
如果要对功能相同、仅类的数据类型不同的各种情况,都重新定义一种新的类型,会产生较大的重复。

  1. 类模板的定义:
    在类的声明前加一行模板关键字。它用一个通用参数 来替代不同的数据类型。类模板的定义格式为:
template <class 类型参数名>class   <类模板名>{    //类体说明 };
其中template 是关键字;<class 类型参数名>中可以有多个参数,其间用逗号分隔。
  1. 使用类模板定义对象的方法:
    类模板名 < 实际数据类型名 > 对象名( 实参列表 )

例 :声明一个类模板,分别实现2个整数、
符点数、字符的比较。

#include <iostream.h>template <class T>  // 定义类模板class compare   //类模板是compare{public:    compare (T a, T b )    { x=a; y=b; }    T max( )    { return (x>y)? x : y; }private:    T x,y;};void  main( ){  compare < int > cmp1(3,7);   //使用类模板定义对象cmp1   cout<<cmp1.max( )<<“是两个整数中最大的数”<<endl;   compare < char > cmp2(‘a’,’g’);   cout<<cmp2.max( )<<“是两个字符中最大的字符”<<endl;   compare < float > cmp3(1.0, 3.0);   cout<<cmp3.max( )<<“是两个浮点数中最大的数”<<endl;}

声明和使用类模板的步骤:
1、写出一个实际类,其语义清晰、准确。
2、将准备更换的类型名改为虚拟类型名
3、在类的声明前加一行,格式为:

template <class虚拟类型名>

4、用类模板定义对象时,使用以下方式:
类模板名 < 实际数据类型名 > 对象名
或: 类模板名 < 实际数据类型名 > 对象名( 实参列表 )

原创粉丝点击