C 學習摘要之八 模板

2021-06-06 10:08:44 字數 2182 閱讀 1138

第八章 

模板

模板(template)利用一種完全通用的方法來設計函式或類而不必預先說明將被使用的每個物件的型別,利用模板功能可以構造相關的函式或類的系列,因此模板也可稱為引數化的型別。在c++語言中,模板可分為類模板(class template)和函式模板(function template)。

在程式中說明了乙個函式模板後,編譯系統發現有乙個相應的函式呼叫時,將根據實參中的型別來確認是否匹配函式模板中對應的形參,然後生成乙個過載函式。該過載函式的定義體與函式模板的函式定義體相同,稱之為模板函式(template function)。

函式模板與模板函式的區別是:函式模板是模板的定義,定義中用到通用型別引數。模版函式是實實在在的函式定義,它由編譯系統在遇到具體函式呼叫時所產生,具有程式**。

同樣,在說明了乙個類模板之後,可以建立類模板的例項,即生成模板類。

類模板與摸板類的區別是:類模板是模板的定義,不是乙個實實在在的類,定義中用到通用型別引數;模板類是實實在在的類定義,是類模板的例項。

通過前面知識的學習可知,在所定義的函式中,函式形參的型別是固定的,當呼叫函式時,實參的型別要與被調函式的形參型別保持一致,否則會出現型別不一致的錯誤。因此,對於功能相同而只是引數的型別不同的情況,也必須定義不同的函式來分別完成相應的功能,這顯然是很不靈活的。

c++語言中提供的函式模板功能就是為解決以上問題而提出的。c++語言提供的函式模板可以定義乙個對任何型別變數都可進行操作的函式,從而大大增強了函式設計的通用性。因為普通函式只能傳遞變數引數,而函式模板卻提供了傳遞型別的機制。

在c++語言中,使用函式模板的方法是先說明函式模板,然後例項化成相應的模板函式進行呼叫執行。

函式模板的一般說明形式如下:

template 《型別形參表》

返回值型別 函式名(形參表)

在上面的定義形式中,《引數形參表》可以有一到若干個形參,各形參前必須加上class關鍵字,表示傳遞型別,當有多個形參時,各形參間用逗號分隔。從中可以看出,《型別形參表》中的每個形參就表示了一種資料型別。「形參表」中至少有乙個形參的型別必須用《型別形參表》中的形參來定義。

函式模板只是說明,不能直接執行,需要例項化為模板函式後才能執行。當編譯系統發現有乙個函式呼叫:函式名(實參表);時,將根據「實參表」中的實參的型別和已定義的函式模板生成乙個過載函式即模板函式。該模板函式的定義體與函式模板的定義體相同,而「形參表」中的型別則以「實參表」中的實際型別為依據。

類模板實際上就是函式模板的推廣。

說明類模板的一般格式為:

template 《型別形參表》

class 類模板名 ;

(1)《型別形參表》中可以包括一到若干個形參,這些形參既可以是「型別形參」,也可以是「表示式形參」。每個型別形參前必須加class關鍵字,表示對類模板進行例項化時代表某種資料型別,也就是說,型別形參是在類模板例項化時傳遞資料型別用的;表示式形參的型別是某種具體的資料型別,當對類模板進行例項化時,給這些引數提供的是具體的資料,也就是說,表示式形參是用來傳遞具體資料的。當《型別形參表》中的引數有多個時,需用逗號隔開。如:

template

class myclass

;此處定義的類模板名是myclass,它有三個引數arg1、arg2和arg3,其中arg1和arg3是型別形參,在類模板例項化時用於傳遞資料型別,arg2是表示式形參,用於在類模板例項化時傳遞具體資料。

(2)類模板中成員函式可以放在類模板的定義體中(此時與類中的成員函式的定義方法一致)定義,也可以放在類模板的外部來定義,此時成員函式的定義格式如下:

template 《型別形參表》

函式值的返回來性 類模板名《型別名錶》::成員函式(形參)

其中:類模板名即是類模板中定義的名稱;

型別名錶即是類模板定義中的《型別形參表》中的形參名。

(3)類模板定義只是對類的描述,它本身還不是乙個實實在在的類,是類模板。

(4)類模板不能直接使用,必須先例項化為相應的模板類,定義模板類的物件(即例項)後,才可使用。可以用以下方式建立類模板的例項。

類模板名《型別實參表》 物件名錶;

此處的<

型別實參表

>

要與該模板中的

<

型別形參表

>

匹配,也就是說,例項化中所用的實參必須和類模板中定義的形參具有同樣的順序和型別,否則會產生錯誤。

C 學習摘要之八 模板

第八章模板 模板 template 利用一種完全通用的方法來設計函式或類而不必預先說明將被使用的每個物件的型別,利用模板功能可以構造相關的函式或類的系列,因此模板也可稱為引數化的型別。在c 語言中,模板可分為類模板 class template 和函式模板 function template 在程式...

c 學習摘要

1.析構函式為什麼多為虛函式 基類的成員函式如果為虛函式,那麼其子類可以重新實現該函式,如果基類成員函式不為虛函式,那麼子類如果想擁有該方法需要過載。析構函式在物件銷毀時呼叫,用以銷毀物件內那些未被銷毀的變數。這就要求子類可以有自己的析構函式,來銷毀自己的需要銷毀的變數。2.什麼是純虛函式 基類本身...

C學習摘要

在 c 語言中,凡不加返回值型別限定的函式,就會被編譯器作為返回整型值處理。在多重迴圈中,如果有可能,應當將最長的迴圈放在最內層,最短的迴圈放在最外層,以減少 cpu 跨切迴圈層的次數。return 語句不可返回指向 棧記憶體 的 指標 因為該內存在函式體結束時被自動銷毀。大端模式 big endi...