c 模板詳解

2021-06-07 23:13:44 字數 2216 閱讀 4218

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):不能在函式呼叫的引數中指定模板形參的型別,對函式模板的呼叫應使用實參推演來進行

2.類模板

格式:templateclass 類名{}

比如:cpp**

1. template

2. class a

3. ;

類模板物件的建立:比有乙個模板類a,則使用類模板建立物件的方法為am;在類a 後面跟上乙個<>尖括號

並在裡面填上相應的型別,這樣的話類a 中凡是用到模板形參的地方都會被int 所代替。當類模板有兩個模板形參

時建立物件的方法為am;型別之間用逗號隔開。

對於類模板,模板形參的型別必須在類名後的尖括號中明確指定。比如a<2> m;用這種方法把模板形參設定為int

是錯誤的,類模板形參不存在實參推演的問題。也就是說不能把整型值2 推演為int 型傳遞給模板形參。要把類模板

形參調置為int 型必須這樣指定am。

在類模板外部定義成員函式的方法為:template《模板形參列表》 函式反回型別類名《模板形參名》::函式名(引數列表),比如有兩個模板形參t1,t2的類a中含有乙個void h()函式,則定義該函式的語法為:template void a::h(){}。注意當在類外面定義類的成員時template後面的模板形參應與要定義的類的模

板形參一致。

模板的形參

有三種型別的模板形參:型別形參,非型別形參和模板形參。

1、型別形參

1.1 型別模板形參:型別形參由關見字class或typename後接說明符構成,如templatevoid h(t a){};其中t就是乙個型別形參,型別形參的名字由使用者自已確定。模板形參表示的是乙個未知的型別。模板型別形參可作為型別說

明符用在模板中的任何地方,與內建型別說明符或類型別說明符的使用方式完全相同,即可以用於指定反回型別,

變數宣告等。

1.2 不能為同乙個模板型別形參指定兩種不同的型別,比如templatevoid h(t a, t b){},語句呼叫h(2, 3.2)將出錯,因為該語句給同一模板形參t指定了兩種型別,第乙個實參2把模板形參t指定為int,而第二個實參3.2把模板形參指定為double,兩種型別的形參不一致,會出錯。

2、非型別形參

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

的模板形參。

2.2 非型別形參在模板定義的內部是常量值,也就是說非型別形參在模板的內部是常量。

2.3 非模板型別的形參只能是整型,指標和引用,像double,string, string **這樣的型別是不允許的。但是double &,double*,物件的引用或指標是正確的。

2.4 呼叫非型別模板形參的實參必須是乙個常量表示式,即他必須能在編譯時計算出結果。

2.5 注意: 任何區域性物件,區域性變數,區域性物件的位址,區域性變數的位址都不是乙個常量表示式,都不能用作非型別模

板形參的實參。全域性指標型別,全域性變數,全域性物件也不是乙個常量表示式,不能用作非型別模板形參的實參。

2.6 全域性變數的位址或引用,全域性物件的位址或引用const型別變數是常量表示式,可以用作非型別模板形參的實參。

類模板非型別形參示例

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

cpp**

1. //類模板的定義

2. templateclass a; //定義帶有乙個類模板型別形參t的類a

3. templateclass b; //定義帶有兩個類模板型別形參t1,t2的類b

cpp**

1. //定義類模板的預設型別形參,預設型別形參不適合於函式模板。

2. templateclass d; //定義帶預設型別形參的類模板。這裡把t2預設設定為int型。

cpp**

1. //templateclass e{}; //錯誤,為t1設了預設型別形參則t1後面的所有形參都必須設定認默值。

cpp**

1. //以下為非型別形參的定義 www.2cto.com

C 模板詳解

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

C 模板詳解

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

c 模板詳解

模板是c 支援引數化多型的工具,使用模板可以使使用者為類或者函式宣告一種一般模式,使得類中的某些資料成員或者成員函式的引數 返回值取得任意型別。模板是一種對型別進行引數化的工具 通常有兩種形式 函式模板和類模板 使用模板的目的就是能夠讓程式設計師編寫與型別無關的 比如編寫了乙個交換兩個整型int 型...