物件導向和泛型程式設計在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)類宣告和定義
如果在類宣告中定義了方法(內聯),則可以省略模板字首和類限定符;
不能將模板成員函式放在獨立的實現檔案中。
12#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)可以將具體化的模板用作自身的型別引數,達到遞迴的目的。
1typedef array arraytp;
2 arraytp< arraytp, 10 > twodee; //
等價於int twodee[10][5]
(4)將模板用作引數
模板可以包含本身就是模板的引數。
1 template< templateclass thing >2class
crab
3;
(5)使用多個型別引數
模板可以使用多個型別引數。
(6)給模板引數提供預設值
可以給類模板引數提供預設值,但不能給函式模板引數提供預設值,可以為非型別引數提供預設值。
1 template2class
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...