9 函式模板 類模板

2021-10-08 07:24:58 字數 1979 閱讀 5491

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 ...