2. 類模板
在函式體一樣,僅僅函式引數型別不一樣時,為了提高**的復用性,引入函式模板。進而引入類模板
1. 宣告
// 定義
template
《型別形式參數列》
型別 函式名(形式參數列)
// 使用
函式名《型別形式參數列》
(形式參數列)
;
2. 規則
函式模板可過載
模板型別引數至少需要在函式定義中出現一次
函式模板不允許匹配時自動型別轉換,必須嚴格匹配
匹配原則:
編譯器優先考慮普通函式
若函式模板可以產生更好的匹配則使用函式模板
可通過空實參列表<>來強制使用函式模板
add<
>(1
,2);
// 若存在int型別普通函式,則本應該優先使用普通函式,但是加了<>後強制使用函式模板
3. 示例// 定義
template
<
typename t>
t add
(const t &a,
const t &b)
// 使用
intmain()
4. 原理
函式模板會進行兩次編譯:
第一次是在函式宣告的地方對函式體進行編譯
第二次是在呼叫的地方分別生成對應的模板函式,並進行具體編譯
1. 宣告
template
《型別形式參數列》
類宣告
2. 示例template
<
typename t>
class
a t &
gett()
protected
:public
: t t;
};
3. 說明
template
只能保證函式內部可以隨便使用型別t,但是函式的引數列表以及返回值中如果用到了類a,需要加參數列明確引數列表以及返回值的泛型具體型別。(因為要分配記憶體,所以需要具體化的型別來明確記憶體的大小)
比如類a是乙個類模板,當其成員函式在類外進行定義時需要進行以下步驟:
函式前面要加上template
函式形參中用到類a型別時,需要加參數列明確型別
函式返回值用到類a型別時同樣要加
函式名進行類a的域作用符限定時也要加
但是函式內部使用類a時則不用
template
<
typename t>
complex complex
::operator
+(complex
&c)
繼承中,子類需要讓編譯器知道父類的模板引數具體是什麼型別(因為要分配記憶體),可以用具體型別指定,也可以用子類的模板引數型別指定
classb:
public a<
int>
4. 用法
所有的類模板函式都寫在類內部(正常方式寫即可)
友元函式:用友元函式過載 << >>
因為兩次編譯的函式頭不一樣,所以類內部的宣告需要加上
friend ostream&
operator
<<
(ostream &out, complex
&c3)
;
類模板函式宣告和定義分開時,呼叫者要包含cpp檔案而不是.**件
因為僅有.**件,因為兩次編譯的問題,編譯器找不到函式實現
因此,建議將宣告和定義都寫在.**件中,stl就是這麼做的
模板 函式模板 類模板
模板主要是針對資料型別,不同的資料型別卻具有相同的操作形式,比如說,同樣是做入棧,int和double由於資料型別不一樣,需要做兩個棧才能滿足需求,誠然可以使用函式過載,但是終歸棧的操作是一樣的,只是資料型別不一樣。所以在此基礎上,假設,我們首先將所有的資料型別視為乙個大類,將它引數化,等到要用的時...
模板函式,模板類
使用模板函式 include stdafx.h include iostream include string using namespace std template template t add const t t1,const t t2 int tmain int argc,tchar arg...
函式模板,類模板
來自 函式模板 template t getmax t a,t b 呼叫 int i 5,j 6,k long l 10,m 5,n k getmax i,j n getmax l,m 也可以雙型別 template t getmin t a,u b return a呼叫 int i,j long ...