c 模板詳解

2022-08-05 07:27:16 字數 2190 閱讀 9146

模板是c++支援引數化多型的工具,使用模板可以使使用者為類或者函式宣告一種一般模式,使得類中的某些資料成員或者成員函式的引數、返回值取得任意型別。

模板是一種對型別進行引數化的工具;通常有兩種形式:函式模板和類模板;

使用模板的目的就是能夠讓程式設計師編寫與型別無關的**。比如編寫了乙個交換兩個整型int 型別的swap函式,這個函式就只能實現int 型,對double,字元這些型別無法實現,要實現這些型別的交換就要重新編寫另乙個swap函式。使用模板的目的就是要讓這程式的實現與型別無關,比如乙個swap模板函式,即可以實現int 型,又可以實現double型的交換。

注意:模板的宣告或定義只能在全域性,命名空間或類範圍內進行。即不能在區域性範圍,函式內進行,比如不能在main函式中宣告或定義乙個模板。

1、函式模板

template 返回型別 函式名(引數列表) 

其中template和class是關鍵字,class可以用typename 關鍵字代替,在這裡typename 和class沒區別,<>括號中的引數叫模板形參,模板形參和函式形參很相像,模板形參不能為空。一但宣告了模板函式就可以用模板函式的形參名宣告類中的成員變數和成員函式,即可以在該函式中使用內建型別的地方都可以使用模板形參名。模板形參需要呼叫該模板函式時提供的模板實參來初始化模板形參,一旦編譯器確定了實際的模板實參型別就稱他例項化了函式模板的乙個例項。比如swap的模板函式形式為

template void swap(t& a, t& b){},

當呼叫這樣的模板函式時型別t就會被被呼叫時的型別所代替,比如swap(a,b)其中a和b是int 型,這時模板函式swap中的形參t就會被int 所代替,模板函式就變為swap(int &a, int &b)。而當swap(c,d)其中c和d是double型別時,模板函式會被替換為swap(double &a, double &b),這樣就實現了函式的實現與型別無關的**。

注意:對於函式模板而言不存在 h(int,int) 這樣的呼叫,不能在函式呼叫的引數中指定模板形參的型別,對函式模板的呼叫應使用實參推演來進行,即只能進行 h(2,3) 這樣的呼叫,或者int a, b; h(a,b)。

2、類模板

templateclass 類名

;類模板和函式模板一樣,都是以template開始後接模板形參列表組成,模板形參不能為空,一但宣告了類模板就可以用類模板的形參名宣告類中的成員變數和成員函式,即可以在類中使用內建型別的地方都可以使用模板形參名來宣告。比如:

templateclass a;

在類a中宣告了兩個型別為t的成員變數a和b,還宣告了乙個返回型別為t帶兩個引數型別為t的函式hy。

類模板物件的建立:比如乙個模板類a,則使用類模板建立物件的方法為am;在類a後面跟上乙個<>尖括號並在裡面填上相應的型別,這樣的話類a中凡是用到模板形參的地方都會被int 所代替。當類模板有兩個模板形參時建立物件的方法為am;型別之間用逗號隔開。

對於類模板,模板形參的型別必須在類名後的尖括號中明確指定。比如a<2> m;用這種方法把模板形參設定為int是錯誤的(編譯錯誤:error c2079: 'a' uses undefined class 'a'),類模板形參不存在實參推演的問題。也就是說不能把整型值2推演為int 型傳遞給模板形參。要把類模板形參調置為int 型必須這樣指定am。

在類模板外部定義成員函式的方法為:

template《模板形參列表》 函式返回型別 類名《模板形參名》::函式名(引數列表),

比如有兩個模板形參t1,t2的類a中含有乙個void h()函式,則定義該函式的語法為:

templatevoid a::h(){}。

注意:當在類外面定義類的成員時template後面的模板形參應與要定義的類的模板形參一致。

3、模板的形參

有兩種型別的模板形參:型別形參和

非型別形參。

1. 型別形參

型別形參由關鍵字class或typename後接說明符構成,如templatevoid h(t a){};其中t就是乙個型別形參,型別形參的名字由使用者自已確定。模板形參表示的是乙個未知的型別。模板型別形參可作為型別說明符用在模板中的任何地方,與內建型別說明符或類型別說明符的使用方式完全相同,即可以用於指定返回型別,變數宣告等。

2. 非型別形參

非型別模板形參:模板的非型別形參也就是內建型別形參,如templateclass b{};其中int a就是非型別的模板形參。

c 模板詳解

c 模板分為2類 1.函式模板 格式 template void swap t a,t b 呼叫時 int a,b swap a,b double d1,d2 swap d1,d2 但是下面寫法是錯誤的 swap int,int 不能在函式呼叫的引數中指定模板形參的型別,對函式模板的呼叫應使用實參推...

C 模板詳解

模板分類 類模板假如現在需要實現乙個交換整數的函式,很簡單就能實現,但是如果沒有說交換型別,那麼可能需要寫各種型別的過載,函式過載雖然可以實現,但是這麼做很麻煩,函式的復用性很低,且 的可維護性比較低,乙個出錯可能讓所有過載都錯。void swap int left,int right void s...

C 模板詳解

模板是c 支援引數化多型的工具,使用模板可以使使用者為類或者函式宣告一種一般模式,使得類中的某些資料成員或者成員函式的引數 返回值取得任意型別。模板是一種對型別進行引數化的工具 通常有兩種形式 函式模板和類模板 函式模板針對僅引數型別不同的函式 類模板針對僅資料成員和成員函式型別不同的類。使用模板的...