C++:类模板与模板类
6.3 類模板和模板類
所謂類模板,實際上是建立一個通用類,其數(shù)據(jù)成員、成員函數(shù)的返回值類型和形參類型不具體指定,用一個虛擬的類型來代表。使用類模板定義對象時,系統(tǒng)會實參的類型來取代類模板中虛擬類型從而實現(xiàn)了不同類的功能。
定義一個類模板與定義函數(shù)模板的格式類似,必須以關(guān)鍵字template開始,后面是尖括號括起來的模板參數(shù),然后是類名,其格式如下:
template <typename 類型參數(shù)>
class 類名{
? ? ? ?類成員聲明
};
或者
template <class 類型參數(shù)>
class 類名{
? ? ? ?類成員聲明
};
(1)template:是一個聲明模板的關(guān)鍵字,它表明聲明一個模板
(2)類型參數(shù):通常用C++標(biāo)識符表示,如T、Type等,實際上是一個虛擬的類型名,現(xiàn)在未指定它是哪一種具體的類型,但使用類模板時,必須將類型參數(shù)實例化。
(3)typename和class的作用相同,都是表示其后面的參數(shù)是一個虛擬的類名(即類型參數(shù)).
在類聲明中,欲采用通用數(shù)據(jù)類型的數(shù)據(jù)成員、成員函數(shù)的參數(shù)或返回類型前面需要加上類型參數(shù)。
如建立一個用來實現(xiàn)求兩個數(shù)最大值的類模板
template<typename T> //模板聲明,其中T為類型參數(shù)class Compare{public:Compare(T i,T j){x = i;y = j;}T max(){return (x>y)?x:y;} private:T x,y; };用類模板定義對象時,采用以下形式:
類模板名<實際類型名>對象名[(實參表列)];
因此,使用上面求最大值的類型模板的主函數(shù)可寫成:
//例6.6 類模板compare的使用舉例
#include<iostream.h> template<typename T> //模板聲明,其中T為類型參數(shù) class Compare{public:Compare(T i,T j){x = i;y = j;}T max(){return (x>y)?x:y;} private:T x,y; }; int main() { Compare<int>com1(3,7); //用類模板定義對象com1,此時T被int替代 Compare<double>com2(12.34,56.78); //用類模板定義對象com2,此時T被double替代 Compare<char>com3('a','x'); //用類模板定義對象com3,此時T被char替代 cout<<"其中的最大值是:"<<com1.max()<<endl; cout<<"其中的最大值是:"<<com2.max()<<endl; cout<<"其中的最大值是:"<<com3.max()<<endl; return 0; } /* 程序運行結(jié)果是: 其中的最大值是:7 其中的最大值是:56.78 其中的最大值是:x */在以上例子中,成員函數(shù)(其中含有類型參數(shù))是定義類體內(nèi)的。但是,類模板中的成員函數(shù),也可以在類模板外定義。此時,若成員函數(shù)中有參數(shù)類型存在,則C++有一些特殊的規(guī)定:
(1)需要在成員函數(shù)定義之前進行模板聲明;
(2)在成員函數(shù)名前綴上"類名<類型參數(shù)>::";
在類模板外定義成員函數(shù)的一般形式如下:
//例6.7 在類模板外定義成員函數(shù)函數(shù)舉例。
#include<iostream.h> template<typename T> //模板聲明,其中T為類型參數(shù) class Compare{public:Compare(T i,T j){x = i;y = j;}T max(); private:T x,y; }; template<class T> T Compare<T>::max() {return (x>y)?x:y; } int main() { Compare<int>com1(3,7); //用類模板定義對象com1,此時T被int替代 Compare<double>com2(12.34,56.78); //用類模板定義對象com2,此時T被double替代 Compare<char>com3('a','x'); //用類模板定義對象com3,此時T被char替代 cout<<"其中的最大值是:"<<com1.max()<<endl; cout<<"其中的最大值是:"<<com2.max()<<endl; cout<<"其中的最大值是:"<<com3.max()<<endl; return 0; } /* 程序運行結(jié)果是:其中的最大值是:7其中的最大值是:56.78其中的最大值是:x此例中,類模板Compare經(jīng)實例化后生成了3個類型分別為int、double、char的模板類,這3個模板類經(jīng)實例化后又生成了3個對象com1、com2、com3。類模板代表了一類類,模板類表示某一具體的類。關(guān)系如下:類模板Compare<T>實例化成模板類:Compare<int> Compare<double> Compare<char>實例化模板類對象:com1 com2 com3 *///例6.8 類模板Stack的使用舉例。
#include<iostream.h> const int size=10; template<class T> //模板聲明,其中T為類型參數(shù) class Stack{ //類模板為Stack public:void init(){tos=0;}void push(T ob); //聲明成員函數(shù)push的原型,函數(shù)參數(shù)類型為T類型T pop(); //聲明成員函數(shù)pop的原型,其返回值類型為T類型private:T stack[size]; //數(shù)組類型為T,即是自可取任意類型 int tos; }; template<class T> //模板聲明 void Stack<T>::push(T ob) //在類模板體外定義成員函數(shù)push {if(tos==size){cout<<"Stack is full"<<endl;return;}stack[tos]=ob;tos++; } template<typename T> //模板聲明 T Stack<T>::pop() //在類模板體外定義成員函數(shù)push {if(tos==0){cout<<"Stack is empty"<<endl;return 0;}tos--; return stack[tos]; } int main() {//定義字符堆棧 Stack<char> s1; //用類模板定義對象s,此時T被char取代 s1.init();s1.push('a');s1.push('b');s1.push('c'); for(int i=0;i<3;i++){cout<<"pop s1:"<<s1.pop()<<endl;}//定義整型堆棧 Stack<int> s2; //用類模板定義對象s,此時T被int取代 s2.init();s2.push(1);s2.push(3);s2.push(5); for(int i=0;i<3;i++){cout<<"pop s2:"<<s2.pop()<<endl;} return 0; }/* 程序運行結(jié)果是: pop s1:c pop s1:b pop s1:a pop s2:5 pop s2:3 pop s2:1 說明:(1)在每一個類模板定義之前,都需要在前面加上模板聲明,如template<typename T>或tempplate<class T>并且,類模板在使用時,必須在模板類名字后面綴上<類型參數(shù)> ,如Stack<T> (2)如同模板函數(shù)一樣,模板類也可以有多個類型參數(shù)。 *///例6.9 有兩個類型參數(shù)的類模板舉例
#include<iostream.h> template<class QQ,class T> //聲明模板,具有T1,T2兩個類型參數(shù) class Myclass{ //定義模板類Myclass public:Myclass(QQ a,T b);void show();private:QQ x;T y; }; template<typename QQ,typename T> Myclass<QQ,T>::Myclass(QQ a,T b) {x = a;y = b; } template<class QQ,class T> void Myclass<QQ,T>::show() {cout<<"x="<<x<<","<<"y="<<y<<endl; } int main() {Myclass <int,double>m1(12,0.15); //用類模板定義對象m1,此時T1,T2分別被int、double取代 Myclass <int,char*>m2(12,"This a test."); //用類模板定義對象m2,此時T1,T2分別被int,char*取代 m1.show();m2.show();return 0; } /* 程序運行結(jié)果是: x=12,y=0.15 x=12,y=This a test. */總結(jié)
以上是生活随笔為你收集整理的C++:类模板与模板类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CDateTimeUI类源码分析
- 下一篇: Android--Service完全解析