6 函式模板和類模板

2021-09-20 06:53:55 字數 3042 閱讀 5829

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

1)c++提供兩種模板機制:函式模板、類模板

2)類屬 —— 型別引數化,又稱引數模板

使得程式(演算法)可以從邏輯功能上抽象,把被處理的物件(資料)型別作為引數傳遞。

總結: 模板把函式或類要處理的資料型別引數化,表現為引數的多型性,稱為類屬。

 模板用於表達邏輯結構相同,但具體資料元素型別不同的資料物件的通用行為。

template < 型別形式參數列 >

型別形式引數的形式為:

typename t1 , typename t2 , …… , typename tn

或 class t1 , class t2 , …… , class tn

函式模板呼叫

myswap(a, b); //顯示型別呼叫

myswap(a, b); //自動資料型別推導

編譯器根據具體引數型別生成不同的模板函式。

template

void sortarray(t *a, t2 num) {}

函式模板和普通函式區別結論:

函式模板不允許自動型別轉化

普通函式能夠進行自動型別轉換

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

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

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

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

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

編譯器編譯原理

gcc主要特徵:

1)gcc是乙個可移植的編譯器,支援多種硬體平台

2)gcc不僅僅是個本地編譯器,它還能跨平台交叉編譯。

3)gcc有多種語言前端,用於解析不同的語言。

4)gcc是按模組化設計的,可以加入新語言和新cpu架構的支援

5)gcc是自由軟體

gcc編譯過程 :

預處理(pre-processing)

編譯(compiling)

彙編(assembling)

鏈結(linking)

結論:gcc編譯工具是乙個工具鏈。。。。

函式模板機制結論

編譯器並不是把函式模板處理成能夠處理任意類的函式

編譯器從函式模板通過具體型別產生不同的函式

編譯器會對函式模板進行兩次編譯:

在宣告的地方對模板**本身進行編譯;在呼叫的地方對引數替換後的**進行編譯。

 類模板用於實現類所需資料的型別引數化

 類模板在表示如陣列、表、圖等資料結構顯得特別重要,

這些資料結構的表示和演算法不受所包含的元素型別的影響

 從類模板a派生普通類b

子類從模板類繼承的時候,需要讓編譯器知道 父類的資料型別具體是什麼

 從類模板a派生類模板b

注意為函式的三要素(名稱 引數 返回值)加上

友元函式:用友元函式過載 << >>,宣告時要加上

friend ostream& operator<< (ostream &out, complex &c3) ;

結論:友元函式只用來進行 左移 右移操作符過載。

本質是:模板是兩次編譯生成的,第一次生成的函式頭和第二次生成的函式頭 不一樣

在main函式檔案中要包含.cpp檔案(#include 「demo.cpp」),不然找不到函式體

建議使用第一種(最好)or第三種

歸納以上的介紹,可以這樣宣告和使用類模板:(看看,主要多練習)(宣告 定義 呼叫)

先寫出乙個實際的類。由於其語義明確,含義清楚,一般不會出錯。

將此類中準備改變的型別名(如int要改變為float或char)改用乙個自己指定的虛擬型別名(如上例中的numtype)。

在類宣告前面加入一行,格式為:

template

用類模板定義物件時用以下形式:

類模板名《實際型別名》 物件名;

類模板名《實際型別名》 物件名(實參表列);

如:compare cmp;

compare cmp(3,7);

如果在類模板外定義成員函式,應寫成類模板形式:

template

關於類模板的幾點說明:

類模板的型別引數可以有乙個或多個,每個型別前面都必須加class,如:

template

class someclass

;在定義物件時分別代入實際的型別名,如:

someclassobj;

和使用類一樣,使用類模板時要注意其作用域,只能在其有效作用域內用它定義物件。

模板可以有層次,乙個類模板可以作為基類,派生出派生模板類。

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

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

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

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

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

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

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

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

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

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

訓練題:陣列模板類(myvector)完成對int、char、teacher型別元素的管理

結論1: 如果把teacher放入到myvector陣列中,並且teacher類的屬性含有指標,就是出現深拷貝和淺拷貝的問題。

結論2:需要teacher封裝的函式有:

1) 重寫拷貝建構函式

2) 過載等號操作符

3) 過載左移操作符。

理論提高:所有容器提供的都是值(value)語意,而非引用(reference)語意。容器執行插入元素的操作時,內部實施拷貝動作。所以stl容器內儲存的元素必須能夠被拷貝(必須提供拷貝建構函式)。

類模板,模板類和函式模板,模板函式

單整數類 雙整數類 所以c艹跟其他強型別語言為我們提供了乙個所謂模版功能 變數型別 整數 類模板的重點是模板。表示的是乙個模板,專門用於產生類的模子。例子 1 template 2 class vector 3 使用這個vector模板就可以產生很多的class 類 vector vector ve...

函式模板 和類模板

還是例子說話。函式模板 templatemax const t a,const t b 這樣用 int int a 1,b 2 max a,b float float c 1.0f,d 2.0f max c,d double double e 1.0,f 2.0 max e,f 類模板 templa...

函式模板和類模板

1 函式模板 template 形參名,class 形參名,返回型別 函式名 引數列表 其中template和 class 是關鍵字,class 可以用typename 關見字代替,在這裡 typename 和class 沒區別,括號中的引數叫模板形參,模板形參和函式形參很相像,模板形參不能為空。一...