模板是c++中泛型程式設計的基礎。乙個模板就是乙個建立類或函式的藍圖或者說公式。
模板大體分兩種:一種是函式模板,另一種是類模板。
函式模板
格式一般為:
templelate 返回型別 函式名(引數列表)
比如可以定義比較大小的函式max(引數列表),在max(引數列表)中的引數列表,我可能想比較為int型別的兩數大小,或者double型別的兩數大小,那麼我就可以將max()函式宣告為函式模板,這樣一來,就實現了函式的實現與其具體型別無關的**。到了這裡不免想起函式過載,於是又是一番糾結,那麼下面就來討論一下它們的異同點。
首先函式過載,他的定義可以簡單說:函式有同樣的名稱,但是實參引數列表不相同的情形,這樣的同名不同引數的函式之間,稱之為過載函式。引數列表不同可以是引數的型別或者引數的個數,在後者兩者都不同;它是呼叫是通過你的引數的個數或者型別的不同來識別的。
注意:這裡說的是實參,編譯器不以形參名來區分。
優點是:便於擴充方法內容,可以少寫重複**,是為了以更清晰的方式描述類的方法。
缺點也是顯而易見:僅函式名相同,函式體仍然要分別定義,**重複,容易出錯,增加了程式維護的工作量。
比如:
int max(int x,int y);
int max(int x,int y,int z);
可以通過在主函式中通過int a=max(3,6);和int b=max(6,9,12);來分別呼叫以上兩個函式;但是不能通過過不同的返回值來實現函式的過載,如
int max(x,y)
float max(x,y)
這樣編譯器無法識別,因為引數的個數和型別都完全一樣,而返回值不同是沒用的。
注意:過載函式的形參必須不能完全相同:個數不同或者型別不同。
下面再說函式模板,函式模板針對引數型別不同的函式。它的定義簡單來說就是:用同乙個名字定義不同的函式,這些函式功能相同,引數型別和返回型別不同。
優點:函式模板可以用來建立乙個通用功能的函式,對不同型別的資料進行相同的處理,有利於**重複使用,提高程式的開發效率。 函式模板只是對函式的描述,編譯器不為其產生任何執行**,只有當遇到函式呼叫時,編譯器會自動將模板中的型別t用實參的型別來替換,生成乙個過載函式,該過載函式稱為模板函式。
缺點:編譯器給出的有些出錯資訊比較晦澀;為每種型別都生成額外的**,可能導致生成的exe膨脹;由於template需要輸出其實現,因而在大型系統中濫用可能導致構建時間極長;templates在標頭檔案中,這樣一旦有所變更需要重編譯所有相關工程;沒有資訊隱藏等。
比如:
templatetypename fun(typename x)
這個模板函式要用來計算乙個數字的平方。但是若要計算int型,float型,甚至char型的平方也是可以的。因為它是乙個模板函式,當然也可以使用過載函式,但是由於就此題而言,僅僅是資料型別不同,寫3個函式出來工作量很大,沒有多大意義,所以用函式模板較好。typename是通用型別,你傳的引數是什麼型別,這個通用型別就變成什麼型別。
總結:模板和過載都是c++多型的表現形式,c++多型分四種:虛函式多型,模板多型,過載和轉換。它們既然都屬於多型的表現形式就有他們的優缺點,它們相互補充相互促進,才構成了c++多型的多樣化。
模板與泛型程式設計
模板是泛型變成的基礎。泛型程式設計 編譯與型別無關的 是一種復用的方式,模板分為模板函式和模板類。模板函式是乙個通用的函式模板,而不是為每一種型別定義乙個新函式,乙個函式模板就像乙個公式,針對不同型別函式生成不同的函式版本。關鍵字 template 以 template 開始,後面跟乙個模板引數列表...
模板與泛型程式設計
泛型程式設計 編寫與型別無關的通用 是 復用的一種手段。模板是泛型程式設計的基礎。函式模板代表了乙個函式家族,該函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本。模板的格式 template 返回值型別 函式名 引數列表 模板分為類模板和函式模板 模板它本身並不是函式,是編譯...
模板與泛型程式設計
一 函式模板 模板定義以關鍵字template開始,後跟乙個模板引數列表,在模板定義中,模板引數列表不能為空。模板型別引數 型別引數前必須使用class或typename關鍵字。非型別模板引數 表示乙個值而不是乙個型別 陣列引用形參 arr兩端的括號必不可少 void print int arr 1...