6 泛型程式設計與模板

2022-07-31 02:06:12 字數 2895 閱讀 4064

一、如何進行泛型程式設計

c/c++是一種靜態程式語言,必須需要把**翻譯成可執行的二進位制可執行程式然後再執行,一旦編譯好之後就不能再變了(資料型別也就必須確定下無法更改,因此要為每一種資料型別編寫乙份演算法,工程量巨大)。

c語言中的快速排序:

1

void qsort(void *base, size_t nmemb, size_t size,int(*compar)(const

void *, const

void *));

c++提供了模板的程式設計方法來解決泛型程式設計的問題,它的解決思路是,程式設計師先編寫好乙份"套路"**,然後在呼叫時編譯器根據呼叫時的引數再為這種資料型別生成乙份屬於的它**。

二、模板的語法

1  template 2

t max(t num1,m num1)

3

t被稱作模板的型別引數,可以叫任何名字,只是俗成約定叫作t。

它指的是函式呼叫時的任何型別的引數。

雖然模板的型別可以是任意的,但是必須要支援模板函式中所使用到的運算子,因此模板不是成能的,雖然能帶來很多好處,但也帶來了很多問題。

三、函式模板的使用

1、模板的例項化

編譯器不會把函式模板編譯成乙個例項,而是根據呼叫時的引數,再進行例項化(進一步生成二進位制指令)。

2、使用模板時才例項化。

模板只有在呼叫時才會例項化,因此模板編譯正確並不**沒有問題,很多錯誤會產生於呼叫時。

3、二次編譯

第一次是檢查模板的語法,第二次編譯是根據呼叫引數把模板例項化出來然後再檢查運算子是否支援這種型別。

四、函式模板的隱式推斷

a、使用函式模板時可以根據引數的型別來推斷模板的引數

b、當函式模板不能通過函式呼叫時的引數來推斷模板引數時,可以使用《型別,型別...>來明確指定。

c、函式模板引數是可以有預設值的

1、預設值什麼放在右邊

2、c++標準才支援:-std=c++0x

五、函式模板與普通可以過載(特化)

1、同一種格式的函式和函式模板是可以共生,但優先呼叫普通函式,但可以有函式名後新增乙個空的<>指定呼叫函式模板,模板引數根據呼叫時的引數推斷。

2、普通函式在呼叫時可以進行型別提公升,但是這種提公升的結果要低於模板的例項化。

3、函式模板也可以進行型別提公升,但如果有乙個普通函式也可以進行型別提公升呼叫,那麼則優先呼叫普通函式。

六、類模板

a、類模板的語法

類模板的引數可以在類中當作型別使用,可以定義成員、返回值、引數等。

1  template

2class

classname

3;

注意:typename也可以繼續使用,但大多用class以示區別。

b、類模板的使用

類模板必須要經過例項化才能使用,也是需要經過兩次編譯,第一次是把類模板編譯成乙個"套路",這個過程是為了檢查語法,第二次是根據例項化引數,生成乙個類,然後才能使用這個類建立物件。

使用類模板例項化乙個類:

classnamea;

練習:實現棧類模板,成員函式有入棧、出棧、棧空、棧滿。

c、類模板引數不支援隱式推斷,必須顯示例項化

d、靜態成員的定義的語法

1 template int mystack::num = 10;

靜態成員必須在類模板例項化之後才被真正定義出來,每個例項化的類都有和份靜態成員,這個例項化類建立出的物件共用乙個靜態成員。

e、遞迴例項化

1 mystackint>> stack;

盡量不要輕易使用。

七、類模板的特化(過載)

特化:指的是當類模板有特殊的型別無法處理時,可以為這種特殊型別單獨例項化出乙個類,這種單獨的實現叫作模板的特化。

全類的第特化:按照類的格式把類完整再實現一遍(重寫一遍)。

1  template<> class classname 

2;

成員特化:給指定的型別提供乙個特殊的的成員函式。

1  template<> 返回值 classname::max(void)2

區域性特化:可以讓使用者根據例項化時的引數來指定使用的類模板

1 template class

n2 };

3 template class n 4 };

5 template class n short>

6 };

7 template class n 8 };

9 template class n 10 {public:n(void){cout <<"5"

<

八、類模板的引數

1、類模板的引數可以有預設值

注意:使用類模板預設值時,<>不能省略,可以空著,但不能不寫。

2、類模板後面的引數可以呼叫前面的引數。

3、普通數值可以對類模板進行例項化,它必須以類似變數的形式存在。

注意:只能是常量才能進行例項化。

模板與泛型程式設計

模板是泛型變成的基礎。泛型程式設計 編譯與型別無關的 是一種復用的方式,模板分為模板函式和模板類。模板函式是乙個通用的函式模板,而不是為每一種型別定義乙個新函式,乙個函式模板就像乙個公式,針對不同型別函式生成不同的函式版本。關鍵字 template 以 template 開始,後面跟乙個模板引數列表...

模板與泛型程式設計

泛型程式設計 編寫與型別無關的通用 是 復用的一種手段。模板是泛型程式設計的基礎。函式模板代表了乙個函式家族,該函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本。模板的格式 template 返回值型別 函式名 引數列表 模板分為類模板和函式模板 模板它本身並不是函式,是編譯...

模板與泛型程式設計

一 函式模板 模板定義以關鍵字template開始,後跟乙個模板引數列表,在模板定義中,模板引數列表不能為空。模板型別引數 型別引數前必須使用class或typename關鍵字。非型別模板引數 表示乙個值而不是乙個型別 陣列引用形參 arr兩端的括號必不可少 void print int arr 1...