6.3 類模板和模板類
所謂類模板,實際上是建立乙個通用類,其資料成員、成員函式的返回值型別和形參型別不具體指定,用乙個虛擬的型別來代表。使用類模板定義物件時,系統會實參的型別來取代類模板中虛擬型別從而實現了不同類的功能。
定義乙個類模板與定義函式模板的格式類似,必須以關鍵字template開始,後面是尖括號括起來的模板引數,然後是類名,其格式如下:
template
class 類名;
或者template
class 類名;
(1)template:是乙個宣告模板的關鍵字,它表明宣告乙個模板
(2)型別引數:通常用c++識別符號表示,如t、type等,實際上是乙個虛擬的型別名,現在未指定它是哪一種具體的型別,但使用類模板時,必須將型別引數例項化。
(3)typename和class的作用相同,都是表示其後面的引數是乙個虛擬的類名(即型別引數).
在類宣告中,欲採用通用資料型別的資料成員、成員函式的引數或返回型別前面需要加上型別引數。
如建立乙個用來實現求兩個數最大值的類模板
template//模板宣告,其中t為型別引數
class
compare
t max()
private
: t x,y;
};
用類模板定義物件時,採用以下形式:
類模板名《實際型別名》物件名[(實參表列)];
因此,使用上面求最大值的型別模板的主函式可寫成:
intmain()
//例6.6 類模板compare的使用舉例
#includetemplate//模板宣告,其中t為型別引數
class
compare
t max()
private
: t x,y;
};int
main()
/*程式執行結果是:
其中的最大值是:7
其中的最大值是:56.78
其中的最大值是:x
*/
在以上例子中,成員函式(其中含有型別引數)是定義類體內的。但是,類模板中的成員函式,也可以在類模板外定義。此時,若成員函式中有引數型別存在,則c++有一些特殊的規定:
(1)需要在成員函式定義之前進行模板宣告;
(2)在成員函式名字首上"類名《型別引數》::";
在類模板外定義成員函式的一般形式如下:
temlate函式型別 類名《型別引數》::成員函式名(形參表)
{ 函式體;
}如上題中成員函式max在類模板外定義時,應該寫成:
template
t compare
::max()
//例6.7 在類模板外定義成員函式函式舉例。
#includetemplate//模板宣告,其中t為型別引數
class
compare
t max();
private
: t x,y;
};template
t compare
::max()
intmain() /*
程式執行結果是:
其中的最大值是:7
其中的最大值是:56.78
其中的最大值是:x
此例中,類模板compare經例項化後生成了3個型別分別為int、double、char的模板類,這3個模板類
經例項化後又生成了3個物件com1、com2、com3。類模板代表了一類類,模板類表示某一具體的類。關係如下:
類模板compare例項化成模板類:comparecomparecompare例項化模板類物件:com1 com2 com3
*/
//例6.8 類模板stack的使用舉例。
#includeconstint size=10
;template
//
模板宣告,其中t為型別引數
class stack
void push(t ob); //
宣告成員函式push的原型,函式引數型別為t型別
t pop(); //
宣告成員函式pop的原型,其返回值型別為t型別
private
: t stack[size];
//陣列型別為t,即是自可取任意型別
inttos;
};template
//
模板宣告
void stack::push(t ob) //
在類模板體外定義成員函式push
stack[tos]=ob;
tos++;
}template
//模板宣告
t stack::pop() //
在類模板體外定義成員函式push
tos--;
return
stack[tos];
}int
main()
//定義整型堆疊
stack s2; //
用類模板定義物件s,此時t被int取代
s2.init();
s2.push(1);
s2.push(3);
s2.push(
5);
for(int i=0;i<3;i++)
return0;
}/*程式執行結果是:
pop s1:c
pop s1:b
pop s1:a
pop s2:5
pop s2:3
pop s2:1
說明:(1)在每乙個類模板定義之前,都需要在前面加上模板宣告,如
template或
tempplate並且,類模板在使用時,必須在模板類名字後面綴上《型別引數》 ,如
stack(2)如同模板函式一樣,模板類也可以有多個型別引數。
*/
//例6.9 有兩個型別引數的類模板舉例
#includetemplate//
宣告模板,具有t1,t2兩個型別引數
class myclass;
template
myclass
::myclass(qq a,t b)
template
void myclass::show()
intmain()
/*程式執行結果是:
x=12,y=0.15
x=12,y=this a test.
*/
C 類模板與模板類詳解
在c 的template中很多地方都用到了typename與class這兩個關鍵字,有時候這兩者可以替換,那麼這兩個關鍵字是否完全一樣呢?事實上class用於定義類,在模板引入c 後,最初定義模板的方法為 template,這裡class關鍵字表明t是乙個型別,後來為了避免class在這兩個地方的使...
C 類模板與模板類詳解
在c 的template中很多地方都用到了typename與class這兩個關鍵字,有時候這兩者可以替換,那麼這兩個關鍵字是否完全一樣呢?事實上class用於定義類,在模板引入c 後,最初定義模板的方法為 template,這裡class關鍵字表明t是乙個型別,後來為了避免class在這兩個地方的使...
C 類模板與模板類詳解
在c 的template中很多地方都用到了typename與class這兩個關鍵字,有時候這兩者可以替換,那麼這兩個關鍵字是否完全一樣呢?事實上class用於定義類,在模板引入c 後,最初定義模板的方法為 template,這裡class關鍵字表明t是乙個型別,後來為了避免class在這兩個地方的使...