类模板与模板类

类模板:就是设计类的一种框架,可以适用于不同的数据类型,是类的抽象。利用类模板可以针对不同的数据类型定义出具有共性的一组类。

定义:

template<类型形参列表> class 类模板名

{

类模板定义;

};

其中类型参数列表与函数模板形式相同,如<template T1,template T2,...>


定义类模板时应注意以下几点:

①要是用关键字template

②类型形参列表可以包含抽象的形式类型,也可以是基本数据类型,但至少有一个参数,多个参数之间有逗号“,”隔开

③类模板的成员函数和普通类的定义一样,可在类中或类外定义。并且类模板的成员函数都是函数模板

template<类型形参列表>

函数返回类型 类模板名 <类型名表> :: 函数名(形参表)

{ 函数体}

④类模板本身不是具体的类,所涉及的数据类型都是抽象类型,要想使用类模板,必须先用实际的类型来取代抽闲的类型,此过程将确定类模板的实例,即模板类

类模板名 <类型实参表列>  对象名;


通过一个实例说明类模板的使用,适合任何类型的使用:

#include <iostream>
using namespace std;

template <typename T,int size> class SafeArray  //定义类模板
{
  private:
      T ary[size];      //数组ary大小由模板参数size决定
  public:
      SafeArray();      //声明函数
      T & operator[](int i);
      void Print();
};

template <typename T,int size>
    SafeArray<T,size>::SafeArray()         //构造函数
    {
        int i;
        for(i = 0;i<size;i++)
            ary[i]=0;   //初值设为0,对基本数据类型有效
    }

template <typename T,int size>
    T &SafeArray <T,size> :: operator[](int i)   //重载运算符[]
    {
        if(i<0||i>=size)    //进行下标安全性检查,超出下标范围就退出程序
        {
            cout<<"下标越界!"<<endl;
            exit(0);
        }
        return ary[i];
    }

template <typename T,int size>
    void SafeArray <T,size> :: Print()  //打印函数
    {
        int i;
        for(i = 0;i<size;i++)
            cout<<ary[i]<<"  ";
        cout<<endl;
    }
int main()
{
    SafeArray <int,5> si;       //整型的类对象
    SafeArray <float,4> sf;     //float型的类对象
    si[2] = 10;
    sf[3] = 3.1f;
    si.Print();
    sf.Print();
    return 0;
}
输出结果为:

0  0  10  0  0

0  0  0  3.1


由于类模板的这种类型无关的特点,类模板非常适合定义一些常用的数据结构,像堆栈,队列,链表等。


实例二,利用类模板实现堆栈

#include <iostream>
using namespace std;

template <typename T> class Stack
{
private:
    T *pstk;            //堆栈数据存储区指针变量
    int size;       //堆栈容量
    int top;            //判断是否到达的栈顶的变量
public:
    Stack(int n);       //构造函数
    bool Push(T &t);    //入栈函数
    T *Pop();           //出栈函数
    ~Stack()            //析构函数,用于释放动态分配的内存
    {
        delete[] pstk;
    }
};

template <typename T>
Stack<T> :: Stack(int n)
{
    pstk = new T[n];
    size = n;
    top = 0;    //初始栈里没数据
}

template <typename T>
bool Stack<T> :: Push(T &t)
{
    if(top >= size) //判断堆栈是否满了
    {
        cout<<"栈已经满了!"<<endl;
        return false;
    }
    pstk[top++] = t;    //没满就入栈
    return true;
}

template <typename T>
T * Stack<T> :: Pop()
{
    if(top <= 0)    //判断堆栈是否为空
    {
        cout<<"栈为空!"<<endl;
        return NULL;
    }
    return &pstk[--top];    //没空就出栈
}
int main()
{
    int a=10,b=12,*pa=NULL;
    Stack<int> stk(20);     //定义用来存储整型数的堆栈对象stk,容量为20
    stk.Push(a);
    cout<<a<<endl;
    stk.Push(b);
    cout<<b<<endl;
    pa = stk.Pop();
    if(pa != NULL)
        cout<<*pa<<endl;
    pa = stk.Pop();
    if(pa != NULL)
        cout<<*pa<<endl;
    pa = stk.Pop();
    if(pa != NULL)
        cout<<*pa<<endl;    //此时堆栈为空
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值