趙娟
摘要:本文主要介紹C++中參數(shù)化程序設計類型——模版,分別從函數(shù)模版和類模版兩個方面介紹了模版的使用,通過實例加以比較,得出模版是一種通用性強、重用性高的類型。
關鍵詞:C++;模版;參數(shù)化程序設計;重用
中圖分類號:TP311? ? ? 文獻標識碼:A
文章編號:1009-3044(2019)20-0296-02
開放科學(資源服務)標識碼(OSID):
Abstract: This paper mainly introduces the parameterization programming type in C++:template, which introduces the use of templates from two aspects: function template and class template. By comparison with examples, the template is a type with high versatility and high reusability.
Key words: C ++; template; parameterized programming; reuse
1 引言
C++語言的繼承性和多態(tài)性的目的就是實現(xiàn)代碼的重用,為了實現(xiàn)代碼重用,C++引入了標準模板庫STL,使用STL使得程序盡可能地通用,STL的核心就是模板,如容器、算法等都是模板。
模板是一種通用的程序設計,是C++提供的一種參數(shù)化程序設計類型。通常我們想要比較不同數(shù)據(jù)類型的時候不得不定義兩種不同的函數(shù)來表示區(qū)分,為了能精簡代碼和避免強類型的嚴格性和靈活性的沖突,我們就需要用到模板去改善這種情況。
C++模版分為兩類:函數(shù)模版和類模版。函數(shù)模版是一類函數(shù)的抽象,它的形參可以是任意類型,使用同一函數(shù)模版可以實現(xiàn)不同數(shù)據(jù)類型數(shù)據(jù)的同一操作。類模版為用戶定義了一種模式,是提高C++編程效率的一種方法。和普通類相比,類模板的特點是類中的某些成員數(shù)據(jù)的類型,某些成員函數(shù)的形參、返回值能取任意類型,包括基本數(shù)據(jù)類型和自定義類型。
2 函數(shù)模板
函數(shù)模版是函數(shù)重載的簡化,函數(shù)重載是用兩個或兩個以上的函數(shù)對不同數(shù)據(jù)類型數(shù)據(jù)或者不同個數(shù)的數(shù)據(jù)完成相同的操作,而函數(shù)模版是用一個函數(shù)對不同數(shù)據(jù)類型數(shù)據(jù)完成相同的操作,重載的過程留給編譯器在編譯階段實現(xiàn),進而簡化程序。
2.1 函數(shù)模板實例
此例是用來計算任意類型數(shù)的絕對值。該函數(shù)模板就為程序員提供了一個計算絕對值的算法,程序員只需要在使用時賦予具體的實參,編譯器會根據(jù)實參的類型推導出函數(shù)模板的形參類型。例如,對于調(diào)用表達式a(-2),由于實參-2為int型,所以推導出模板中類型參數(shù)T為int。當形參類型確定后,編譯器將以函數(shù)模板為樣板,生成一個函數(shù):int a(int? x)? {return? x>0?x:-x; },因此,函數(shù)模板是函數(shù)重載的簡化,可以使函數(shù)體保持不變。
2.2 函數(shù)模板在冒泡排序算法上的應用
使用函數(shù)模板的冒泡排序可適用于任何含有n個元素的一維數(shù)組中,數(shù)組中元素類型T可取整型,實型,甚至是自定義類型。若在冒泡排序時不使用函數(shù)模板則會變成下列情況:
此時的冒泡排序只能適用于n個int型數(shù)據(jù),其他類型數(shù)據(jù)則無法使用。
3 類模板
類模板的抽象層次比類高,它是對不同類的公共性質(zhì)的抽象,而類是對一組對象的公共性質(zhì)的抽象。類模板為用戶提供了一種定義類的模式,使得類中的某些成員數(shù)據(jù)的類型,某些成員函數(shù)的形參、返回值可以是任意類型,包括基本數(shù)據(jù)類型和自定義數(shù)據(jù)類型。
3.1 類模板在堆棧的應用
在堆棧中使用類模板,使得類模板的數(shù)據(jù)成員list數(shù)組的成員可以是任意類型。函數(shù)成員Push的形參、Pop的返回值也可以是任意類型。讓堆棧這種數(shù)據(jù)結(jié)構(gòu)在使用的時候不拘泥于數(shù)據(jù)類型的限制,算法的重用性更高了。
3.2 類模板中函數(shù)成員的定義
以上例的堆棧類模板為例,由于類模板的成員函數(shù)操作的數(shù)據(jù)成員的數(shù)據(jù)類型不確定,導致了類模板的函數(shù)成員一定是模板函數(shù),所以類模板的成員函數(shù)的定義也要按照模板函數(shù)的要求去定義。
3.3類模板中對象的定義
由于類模板中成員數(shù)據(jù)的數(shù)據(jù)類型不確定,所以對象的成員數(shù)據(jù)類型也不確定,因此在定義對象時,首先要確定對象的成員數(shù)據(jù)的類型,即類模板成員數(shù)據(jù)的類型。
4結(jié)論
通過上述舉例,我們發(fā)現(xiàn)C++中的模板是一種靈活性強,可重用性高,可擴展性強的泛型程序設計機制。使用模板可以大大減少開發(fā)時間,可以把用同一個算法適用于不同類型數(shù)據(jù),只需在編譯時確定具體的數(shù)據(jù)類型則可。從多態(tài)的角度考慮,模版模擬多態(tài)要比C++類繼承實現(xiàn)多態(tài)效率要高, 無虛函數(shù), 無繼承。
參考文獻:
[1] 鄭莉,董淵,何江舟.C++語言程序設計(第4版)[M]. 北京;清華大學出版社,2014.
[2] 趙海廷. C++語言的模板及其應用[J]. 武漢工程職業(yè)技術學院學報,2004.
[3] 王昌晶,薛錦云. 從C++ 模板到STL[J]. 江西師范大學學報(自然科學版),2004.
[4] 霍有亮. 基于C++的模板與重用[J]. 西北大學學報(自然科學版),1998.
[5] 王波. C++語言中的模板應用[J]. 微型機與應用,2003.
[6] 朱素英. C++語言中模板應用研究[J]. 婁底師專學報,2004.
【通聯(lián)編輯:梁書】