C 模板小結

2022-09-11 12:24:12 字數 3688 閱讀 8394

物件導向和泛型程式設計在c++的程式設計思想中佔據絕對的地位,而模板又是泛型程式設計的主要內容。

函式模板

1. 普通模板

//

以swap名稱為例

template //

or class

void swap(t0 &a, t1 &b)

2. 具體化

隱式例項化、顯式例項化、顯式具體化統稱為具體化。

(1) 顯式具體化(可以寫成兩種形式)

//

以swap名稱為例

template <>

void swap(int &a, int &b)

//or

/*template <>

void swap(int &a, int &b) //是可選的

*/

(2)顯式例項化

在模板宣告中用符號『<>』顯式的指出類名。

//

以swap名稱為例

template void swap(int , int );

(3)隱式例項化

依賴輸入實參型別例項化模板。

//以swap名稱為例

//模板宣告

template void swap(t0 &, t1 &)

//程式入口

void

main()

........

}

3. 使用哪個函式版本

對於函式過載、函式模板、函式模板過載,c++有乙個良好的策略,決定函式呼叫使用哪乙個函式定義。這個過程稱作過載解析。

對此,編譯器需要決定哪乙個可行函式是最佳的,從最佳到最差的順序如下:

一、完全匹配,常規函式優先於模板;

二、提公升轉換(如char,short —> int或float —> double)

三、標準轉換(數值型別之間的非提公升轉換)

四、使用者(使用者指使用模板定義的程式設計師)定義的轉換(?使用者定義的轉換是什麼,怎麼表示?如何直觀地驗證其優先順序最低?)

(1)完全匹配和最佳匹配

完全匹配允許一些無關緊要的轉換(如陣列和指標、引用和變數之間)

有兩個函式完全匹配是一種錯誤,但這一規則有兩個例外:

乙個是指向非const的引用或指標優先與非const指標或引用匹配,其次與const指標或引用匹配(注:只限於引用或指標);

另乙個是當兩個函式完全匹配時將選擇最具體(需要進行的轉換最少)的版本。

(2)建立自定義選擇

(?)在函式呼叫中顯式地使用符號『<>』使模板函式具體化。(?)

類模板

1. 類模板語法規則

(1)類宣告和定義

如果在類宣告中定義了方法(內聯),則可以省略模板字首和類限定符;

不能將模板成員函式放在獨立的實現檔案中。

1

2#ifndef a_h_

3#define a_h_

4 #include5

using

namespace

std;

67 template

8classa9

13void show() //

內聯14

void view();//模板類方法

宣告15

};16

17 template//模板類方法定義

18void a::view()19

2223

#endif

(2)模板類的使用

1 #include"

a.h"23

void show(int &);45

void

main()

6

2. 模板的引數

(1)使用非型別引數

模板中由typename或class限定的型別稱作型別引數;已知型別稱作非型別(或表示式)引數。

templateint n>  //

t為型別引數,n為非型別引數。

非型別引數可以是整型、列舉、引用或指標。(double m是不合法的,但double &和double*是合法的)

模板**不能修改引數的值,也不能使用引數的位址。

例項化模板時,用作非型別引數的值必須是常量表示式(比如不能把變數賦給模板類array中的非型別引數n,array類相對於vector類執行速度快,適合處理大量小陣列)。

(2)具體化的模板類可以作為其它模板的型別引數

array < stack > asi //外層尖括號內側最好用空格隔開

(3)可以將具體化的模板用作自身的型別引數,達到遞迴的目的。

1

typedef array arraytp;

2 arraytp< arraytp, 10 > twodee; //

等價於int twodee[10][5]

(4)將模板用作引數

模板可以包含本身就是模板的引數。

1 template< templateclass thing >

2class

crab

3;

(5)使用多個型別引數

模板可以使用多個型別引數。

(6)給模板引數提供預設值

可以給類模板引數提供預設值,但不能給函式模板引數提供預設值,可以為非型別引數提供預設值。

1 template

2class

topo

3

3. 類模板的具體化

(1)隱式例項化

arraytp stuff;

(2)顯式例項化

template class arraytp;

(3)顯式具體化

當對特殊型別例項化時,要對模板進行修改,使其行為不同。這種情況下可以建立顯式具體化。

template <> class classname;

(4)部分具體化

//

普通模板

template class

pair;

//具體化t2為int

template class pairint>;

4. 模板成員

我們提到過資料成員,函式成員,這裡引入模板成員。

模板可以作為結構、類和模板類的成員。

5. 模板類和友元

模板類的宣告也可以有友元。模板的友元分三類:

1. 非模板友元(類似於普通類的友元);

2. 約束模板友元;

使得模板類的每乙個具體化,都獲得與友元匹配的具體化。包含以下三部:

(1)在類定義的前面宣告每個模板函式;

(2)在函式中再次將模板宣告為友元;

(3)為友元函式提供模板定義。

3. 非約束模板友元。

對於非約束化模板友元,友元模板型別引數與類模板型別引數是不同的。

在類定義中宣告模板函式,並宣告其為友元;之後再為模板函式提供友元定義。

C 模板知識小結

模板定義 模板就是實現 重用機制的一種工具,它可以實現型別引數化,即把型別定義為引數,從而實現了真正的 可重用性。模版可以分為兩類,乙個是函式模版,另外乙個是類模版。由於類模板包含型別引數,因此又稱為引數化的類。如果說類是物件的抽象,物件是類的例項,則類模板是類的抽象,類是類模板的例項。函式模板 t...

模板語言小結

模板語言 和 變數相關的用 邏輯相關的用。1.如果乙個變數是false或者為空,使用給定的預設值。否則,使用變數的值。2.返回值的長度,作用於字串和列表。返回value的長度,如 value a b c d 的話,就顯示4 3.將值格式化為乙個 人類可讀的 檔案尺寸 例如 13 kb 4.1 mb ...

C語言中實現模板函式小結

如果要寫個函式支援多種資料型別,首先想到的就是c 的模板了,但是有時候只能用c語言,比如在linux核心開發中,為了減少 量,或者是某面試官的要求 考慮了一陣子後,就想到了qsort上.qsort的函式原型 void qsort void base,size t num,size t width,i...