C++ 类模板解读
轉自:http://www.cppblog.com/cslover/archive/2013/09/27/203458.html
個人感覺非常完善,也很有幫助
1.?類模板概念
(1)?什么是類模板:?一個類模板允許用戶為類定義一種模式,使得類中的某些數(shù)據(jù)成員、某些成員函數(shù)的參數(shù)、某些成員函數(shù)的返回值能夠取任意類型(包括系統(tǒng)預定義的和用戶自定義的)。
如果一個類中數(shù)據(jù)成員的數(shù)據(jù)類型不能確定,或者是某個成員函數(shù)的參數(shù)或返回值的類型不能確定,就必須將此類聲明為模板,它的存在不是代表一個具體的、實際的類,而是代表著一類類。
(2)類模板定義?定義一個類模板:
A.??首先要定義類,其格式為:
2?class?Test
3?{
4?……
5?}
6?
Test為類名,在類定義體中,如采用通用數(shù)據(jù)類型的成員,函數(shù)參數(shù)的前面需加上T,其中通用類型T可以作為普通成員變量的類型,還可以作為const和static成員變量以及成員函數(shù)的參數(shù)和返回類型之用。例如:
?2?class?TemplateBase
?3?{
?4?public:
?5?????TemplateBase();
?6?????TemplateBase(Type?k);
?7?????~TemplateBase();
?8?
?9?????void?echo();
10?????void?print();
11?????Type?operator+(Type?x);
12?private:
13?????Type?testA;
14?????const?Type?cTestB;
15?????static?Type?sTestC;
16?};
17?
B.???????在類定義體外定義成員函數(shù)時,若此成員函數(shù)中有模板參數(shù)存在,則除了需要和一般類的體外定義成員函數(shù)一樣的定義外,還需在函數(shù)體外進行模板聲明
如果函數(shù)是以通用類型為操作類型,則要在函數(shù)名前的類名后綴上“<T>”。例如:
?1?template<class?Type>?2?void?TemplateBase<Type>::print()
?3?{
?4?????cout<<"testA"<<testA<<endl;
?5?????cout<<"cTestB"<<cTestB<<endl;
?6?????cout<<"sTestC"<<sTestC<<endl;
?7?}
?8?
?9?template<class?Type>
10?Type?TemplateBase<Type>::operator+(Type?x)
11?{
12?????return?testA?+?x;
13?}
14?
C.???????在類定義體外初始化const成員和static成員變量的做法和普通類體外初始化const成員和static成員變量的做法基本上是一樣的,唯一的區(qū)別是需在對模板進行聲明,例如:
1?template<class?Type>2?TemplateBase<Type>::TemplateBase(Type?k):cTestB(k)
3?{
4?????testA?=?k;
5?}
6?
7?template<class?Type>
8?Type?TemplateBase<Type>::sTestC?=?5;
9?
⑶?類模板的使用?類模板的使用實際上是將類模板實例化成一個具體的類,它的格式為:類名<實際的類型>。
??模板類是類模板實例化后的一個產(chǎn)物。把類模板比作一個做餅干的模子,而模板類就是用這個模子做出來的餅干,至于這個餅干是什么味道的就要看你自己在實例化時用的是什么材料了,你可以做巧克力餅干,也可以做豆沙餅干,這些餅干的除了材料不一樣外,其他的東西都是一樣的了(借鑒)。
1.??類模板的派生
??可以從類模板派生出新的類,既可以派生類模板,也可以派生非模板類。派生方法:
⑴?從類模板派生類模板可以從類模板派生出新的類模板,派生格式:
?1?template?<class?T>?2?class?Test
?3?{
?4?……
?5?}
?6?template?<class?T>
?7?class?derive:public?base<T>
?8?{
?9?……
10?};
11?
與一般的類派生定義相似,只是在指出它的基類時要綴上模板參數(shù),即base<T>。
⑵ 從類模板派生非模板類??可以從類模板派生出非模板類,在派生中,作為非模板類的基類,必須是類模板實例化后的模板類,并且在定義派生類前不需要模板聲明語句:template<class>。例如:
?2?{
?3?public:
?4?????DeriveFromTemplate(int?val);
?5?????~DeriveFromTemplate(void);
?6?};
?7?DeriveFromTemplate::DeriveFromTemplate(int?val):TemplateBase<int>(val)
?8?{
?9?????cout<<"Derive?Construct"<<endl;
10?}
11?DeriveFromTemplate::~DeriveFromTemplate()
12?{
13?????cout<<"Derive?Destruct"<<endl;
14?}
15?
在定義derive類時,base已實例化成了int型的模板類。
類模板好處:
(1)它是類型無關的,因此具有很高的可復用性。
(2)它是平臺無關的,可移植性
(3)可用于基本數(shù)據(jù)類型和自定義類型
總結
- 上一篇: 星纪魅族今年上半年发布首款高端手机、AR
- 下一篇: Study to Innovation