C++类模板template <class T>简单使用方法
生活随笔
收集整理的這篇文章主要介紹了
C++类模板template <class T>简单使用方法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一個簡單的例子 兩個數(shù)比大小
-
如果兩個數(shù)都是int類型
-
如果兩個數(shù)是float類型
- 僅僅是因為參數(shù)的類型不一致,就得重新寫一個函數(shù)來比較大小,這個過程是極其繁瑣的,因此引出模板
聲明模板
template <class numtype> //聲明一個模板,虛擬類型名為numtype class Compare //類模板名為Compare { public :Compare(numtype a,numtype b){x=a;y=b;}numtype max( ){return (x>y)?x:y;}numtype min( ){return (x<y)?x:y;} private :numtype x,y; };與先前不使用模板之間的區(qū)別
- 聲明類模板時要增加一行 ? ?template <class 類型參數(shù)名> template意思是“模板”,是聲明類模板時必須寫的關(guān)鍵字。在template后面的尖括號內(nèi)的內(nèi)容為模板的參數(shù)表列,關(guān)鍵字class表示其后面的是類型參數(shù)。在本例中numtype就是一個類型參數(shù)名。這個名宇是可以任意取的,只要是合法的標(biāo)識符即可。這里取numtype只是表示“數(shù)據(jù)類型”的意思而已。此時,mimtype并不是一個已存在的實際類型名,它只是一個虛擬類型參數(shù)名。在main函數(shù)使用的時候?qū)⒈灰粋€實際的類型名取代,比如int、float、double類型
- 原有的類型名int換成虛擬類型參數(shù)名numtype。 在建立類對象時,如果將實際類型指定為int型,編譯系統(tǒng)就會用int取代所有的numtype,如果指定為float型,就用float取代所有的numtype。這樣就能實現(xiàn)“一類多用”。
- 由于類模板包含類型參數(shù),因此又稱為參數(shù)化的類。如果說類是對象的抽象,對象是類的實例,則類模板是類的抽象,類是類模板的實例。 利用類模板可以建立含各種數(shù)據(jù)類型的類。
使用
- Compare <int> cmp(4,7); 即在類模板名之后在尖括號內(nèi)指定實際的類型名,在進行編譯時,編譯系統(tǒng)就用int取代類模板中的類型參數(shù)numtype,這樣就把類模板具體化了,或者說實例化了。這時Compare<int>就相當(dāng)于前面介紹的Compare_int類。
- 然后就可以使用std::cout << cmp.max() <<std::endl; 輸出其內(nèi)部定義的函數(shù)
- [例] 聲明一個類模板,利用它分別實現(xiàn)兩個整數(shù)、浮點數(shù)和字符的比較,求出大數(shù)和小數(shù)。
注意事項
- 還有一個問題要說明: 上面列出的類模板中的成員函數(shù)是在類模板內(nèi)定義的。如果改為在類模板外定義,不能用一般定義類成員函數(shù)的形式:
- numtype Compare::max( ) {…} //不能這樣定義類模板中的成員函數(shù),而應(yīng)當(dāng)寫成類模板的形式:
- 上面第一行表示是類模板,第二行左端的numtype是虛擬類型名,后面的Compare <numtype>是一個整體,是帶參的類。表示所定義的max函數(shù)是在類Compare <numtype>的作用域內(nèi)的。在定義對象時,用戶當(dāng)然要指定實際的類型(如int),進行編譯時就會將類模板中的虛擬類型名numtype全部用實際的類型代替。這樣Compare <numtype >就相當(dāng)于一個實際的類。
總結(jié)
- 歸納以上的介紹,可以這樣聲明和使用類模板:
1)?先寫出一個實際的類。由于其語義明確,含義清楚,一般不會出錯。
2) 將此類中準(zhǔn)備改變的類型名(如int要改變?yōu)閒loat或char)改用一個自己指定的虛擬類型名(如上例中的numtype)。
3) 在類聲明前面加入一行,格式為:
? ? template <class 虛擬類型參數(shù)>
如:
? ? template <class numtype> //注意本行末尾無分號
? ? class Compare
? ? {…}; //類體
4) 用類模板定義對象時用以下形式:
? ? 類模板名<實際類型名> 對象名;
? ? 類模板名<實際類型名> 對象名(實參表列);
如:
? ? Compare<int> cmp;
? ? Compare<int> cmp(3,7);
5) 如果在類模板外定義成員函數(shù),應(yīng)寫成類模板形式:
? ?template <class 虛擬類型參數(shù)>
? ?函數(shù)類型 類模板名<虛擬類型參數(shù)>::成員函數(shù)名(函數(shù)形參表列) {…}
關(guān)于類模板的幾點說明:
- 1)?類模板的類型參數(shù)可以有一個或多個,每個類型前面都必須加class,如:
- template <class T1,class T2>
- class someclass{…};
- 在定義對象時分別代入實際的類型名,如:someclass<int,double> obj;
- 2) 和使用類一樣,使用類模板時要注意其作用域,只能在其有效作用域內(nèi)用它定義對象。
- 3) 模板可以有層次,一個類模板可以作為基類,派生出派生模板類。有關(guān)這方面的知識實際應(yīng)用較少,本教程暫不作介紹,感興趣的同學(xué)可以自行學(xué)習(xí)。
總結(jié)
以上是生活随笔為你收集整理的C++类模板template <class T>简单使用方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ STL list添加(插入)元素
- 下一篇: Ubuntu环境下,使用clion编译器