C 學習歷程8 函式模板和類模板

2021-08-14 19:38:46 字數 1845 閱讀 7815

什麼是函式模板

所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。

凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會根據實參的型別來取代模板中的虛擬型別,從而實現了不同函式的功能。

定義:

template

《型別形式參數列》

例如:template

函式模板宣告:

型別 函式名 (形式參數列)

函式模板和普通函式的區別:函式模板不允許自動型別轉化;普通函式能夠進行自動型別轉換。

函式模板和普通函式在一起呼叫規則:

1 函式模板可以像普通函式一樣被過載

2 c++編譯器優先考慮普通函式

3 如果函式模板可以產生乙個更好的匹配,那麼選擇模板

4 可以通過空模板實參列表的語法限定編譯器只通過模板匹配

函式模板機制

乙個函式模板就可以代表一系列的函式,很是神奇,那麼,它的原理到底是什麼呢?編譯器並不是把函式模板處理成能夠處理任意類的函式。編譯器真正的做法是:從函式模板通過具體型別產生不同的函式,對函式模板進行兩次編譯:在宣告的地方對模板**本身進行編譯;在呼叫的地方對引數替換後的**進行編譯。例如:

template

t max(t a, t b)

max(10,20);

兩次編譯後,實際上相當於:

int max(int a, int b)

max(10,20);

編譯器代替我們實現了這個函式。

類模板

template

class a

void print ()

private:

t a;

};// 類模板物件做函式引數傳遞的時候

// 1、寫乙個具體的 模板類 物件

void myprint(a &a)

void myprint(a &a)

// 2、使用函式模板

template

void printa(a&a)

int main()

2、類模板的派生

1)派生普通類(具體的類)

class b : public a

private:

int b;

};

2)派生類模板(非具體的類)

template class c:public a

private:

t c;

};

3、類模板中的static關鍵字

*從類模板例項化的每個模板類有自己的類模板資料成員,該模板類的所有物件共享乙個static資料成員

*和非模板類的static資料成員一樣,模板類的static資料成員也應該在檔案範圍定義和初始化

*每個模板類有自己的類模板的static資料成員副本

小結:

1模板是c++型別引數化的多型工具。c++提供函式模板和類模板。

2 模板定義以模板說明開始。類屬引數必須在模板定義中至少出現一次。

3同乙個類屬引數可以用於多個模板。

4 類屬引數可用於函式的引數型別、返回型別和宣告函式中的變數。

5模板由編譯器根據實際資料型別例項化,生成可執行**。例項化的函式模板稱為模板函式;例項化 的類模板稱為模板類。

6 函式模板可以用多種方式過載。

7類模板可以在類層次中使用 。

C 函式模板和類模板

一 函式模板 c 提供了函式模板 function template 所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會...

函式模板和類模板(C )

所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。函式模板和普通函式的區別 函式模板不允許自動型別轉化,普通函式能夠進行自動型別轉換 函式模板和普通函式在一起呼叫的規則 1 函式模板可以像普通函式一樣被過載 2 c 編譯器優先...

C 函式模板和類模板

一 函式模板 1.概念 實際是建立乙個模型,然後根據這個模板去例項化一些物件,它的函式型別和形參型別不具體指定,用乙個虛擬的型別來代表,這個通用的函式就稱為函式模板,只要是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需要在模板中定義一次,在呼叫函式時,編譯器會根據實參的型別對函式進行...