类模板的定义和使用

来源:互联网 发布:java 月份第一天 编辑:程序博客网 时间:2024/05/21 14:50
如同函数模板一样,使用类模板使用户可以为类定义一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值能取任意类型。类模板是对一批仅仅成员数据类型不同的类的抽象,程序员只要为这一批类所组成的整个类家族创建一个类模板,给出一套程序代码,就可以用来生成多种具体的类,(这类可以看作是类模板的实例),从而大大提高编程的效率。

 定义类模板的一般形式是:
 template <类型名 参数名1,类型名参数名2,…>
 class 类名
 {
  类声明体
 };

 例如,template <class T>
 class Smemory
 {…
  public:
  void mput(T x);
  …
 }

 表示定义一个名为Smemory的类模板,其中带类型参数T。

在类模板的外部定义类成员函数的一般形式是:
 template <类型名 参数名1,类型名参数名2,…>
 函数返回值类型 类名<参数名 1 参数名 2,…>::成员函数名(形参表)
 {
  函数体
 }

 例如:template <class T>
  void Smemory<T>::mput(T x)
  {…}

  表示定义一个类模板Smemory的成员函数,函数名为mput,形参x的类型是T,函数无返回值。
  类模板是一个类家族的抽象,它只是对类的描述,编译程序不为类模板(包括成员函数定义)创建程序代码,但是通过对类模板的实例化可以生成一个具体的类以及该具体类的对象。

与函数模板不同的是:函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化必须由程序员在程序中显式地指定
其实例化的一般形式是:
  类名 <数据类型 1(或数据),数据类型 2(或数据)…> 对象名

 例如,Smemory<int> mol;
  表示将类模板Smemory的类型参数T全部替换成int 型,从而创建一个具体的类,并生成该具体类的一个对象mol。

类模板的定义和使用下面举例说明类模板的定义和使用方法。
  例9.3.1:类模板的定义和使用。

 #include <iostream.h>
 #include <conio.h>
 const int SIZE=8;
 template <class T>
 class Smemory { //定义类模板Smemory
    T data[SIZE]; //类型为T,长度为SIZE的数组data[]为数据成员
    int count;
    public:
    Smemory( ){ count=0; }
    void mput(T x); //mput()函数的参数x的类型是T
    T mget( ); //声明返回值类型为T的成员函数mget()
   };

 template <class T>
 void Smemory<T>::mput(T x) //定义成员函数mput(),函数的参数类型为T,该函数用于为数据成员 data数组的各个元素赋值
 {
    if(count==8) { cout<<"Memory is full"; return; }
    data[count]=x;
    count++;
 }
 template <class T>
 T Smemory<T>::mget( )  //定义成员函数mget(),函数的返回类型为T,该函数用于取出数据成员 data数组的各个元素
 {
    if(count==0) { cout<<"Memory is empty"; return 0; }
    count--;
    return data[count];
 }
void main( )
 {
  Smemory<int> mo1;
int i; char ch='A';//将Smemory实例化,并创建对象mo1
   Smemory<char> mo2; //将Smemory实例化,并创建对象mo2
   for(i=0; i<8;i++)
   {
    mo1.mput(i);          //调用成员函数mput()
    mo2.mput(ch); ch++; //调用成员函数mput()
   }
   cout<<"Get mo1 => ";
   for(i=0;i<8;i++)
   cout<<mo1.mget( );        //调用成员函数mget()
   cout<<"\nGet mo2 => ";
   for(i=0;i<8;i++)
   cout<<mo2.mget( ); //调用成员函数mget()
   getch();
 }
  程序的运行结果是:
 Get mo1=> 76543210
 Get mo2=> HGFEDCBA


说明:类模板Smemory带一个类型参数T,T是代表数据类型的参数,在类型参数前面必须加关键字class,用class表示类型参数的类型。在实例化时,对应类型参数T必须是具体的数据类型名,这里建立第一个对象时数据类型名是int,表示将类模板Smemory中的所有类型参数T都替换成int型, 从而创建一个具体的类及其对象mo1;在建立第二个对象时数据类型名是char,表示将模板Smemory中的所有类型参数T都替换成char,从而创建一个具体的类及其对象mo2。

 

来源:http://jpk.sdju.edu.cn/cplus/kejian/content/chapter9/chapter9_3_2.htm

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我要移民过香港大陆的驾驶证怎么办 交警开的扣行驶证的单不见了怎么办 行驶证累计记分满12分后怎么办 行车证丢了被交警查到怎么办 手机摔了一下一半黑屏了怎么办 三星手机的显示屏插头坏了怎么办? 被普通的手机维修店骗了怎么办? 手机外屏裂了内屏进水了怎么办 小米2s手机忘了解锁图案怎么办 红米note5手机屏烂了怎么办 网上买好高铁票身份证没带怎么办 高铁票买好了身份证丢了怎么办 苏州园区社保卡丢了怎么办 大学办的社保卡丢了怎么办 毕业六年了大学社保卡丢了怎么办 医保卡丢了补办后卡里余额怎么办 银行卡丢了记不住卡号怎么办 哈尔滨医保卡挂失后又找到了怎么办 孩子在哈尔滨户口在外地医保怎么办 椒江二桥通行证被扣走了怎么办 住建委查到买房材料不真怎么办 房子租出去被别人又租出去了怎么办 在成都乘出租车房产证掉了怎么办 电信不限量卡限网速了怎么办 only实体店换货没有小票怎么办 运管所包车单不给盖章怎么办 上海留学生落户过了取号时间怎么办 电信固话怎么办才能显示自己公司 日本跟团签证没有资产证明怎么办 摇号手机号换了密码忘了怎么办 小客车摇号的账号密码忘了怎么办 去银行交违章罚款单子丢了怎么办 我的身份证被别人办了信用卡怎么办 北京驾驶证在深圳扣了分怎么办 c照一次被扣12分怎么办 教师资格证认定申请表填错了怎么办 外地车在北京违章没有牡丹卡怎么办 护士辞职了原单位不给延续怎么办 护士证注册的单位倒闭了怎么办 护士证注册的医院倒闭了怎么办 显示发货了但没物流信息怎么办