趙娟


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