泛型程式設計顧名思義:可以通泛的使用,比如我們要使用乙個add加法函式,
void
add(
int& a,
int& b)
void
add(
double
& a,
double
& b)
void
add(
float
& a,
float
& b)..
.
那我們可以通過函式過載來實現,但是函式過載有不好的地方,那就是 :
1、過載的函式只是引數型別不同,**的復用率較低,而且只要出現新型別,就要增加相應的函式。
2、**的可維護性比較低,乙個出錯可能導致所有過載都出錯。
所以c++中提供了模板,我們通過給模板中填充不同的「材料」,來生成我們所需要的不同的**。函式模板代表了乙個函式家族,該函式模板與型別無關,在使用時被引數化,根據實參產生函式的指定函式版本。(也就是說,我們在使用的時候,模板會根據我們填充的型別來生成相應的**)函式模板格式:template返回值型別 函式名(引數列表)
template
<
class
t>
t add
(const t& left,
const t& right)
這裡的 typename 是用來定義模板引數關鍵字,也可以用 class 來替換,但是不能用 struct 來替換(c++保留struct是為了相容c,但是c沒有模板,所以沒有必要再支援struct宣告模板形參)
要注意:模板只是乙個藍圖,它本身不是函式,是編譯器使用這種方式產生特定型別函式的模板。
在編譯器編譯階段,對於函式模板的使用,編譯器根據傳入實參的型別來推演生成對應型別的函式以供呼叫。比如:當傳入函式模板的實參的型別是double,那麼編譯器通過對實參型別的推演,將 t 確定為 double 型別,然後產生乙份專門處理 double 型別的**,對字元型別也是如此(可以檢視組合語言呼叫過程,呼叫不同型別是不同函式)
像上圖這樣呼叫模板叫做隱式例項化
但是當這樣呼叫add(a1, d1)時,編譯器不知道如何推演,不知道推演成int 還是double,所以就會報錯,這種情況有兩種處理方式:
1、使用者自己強制型別轉換
cout <<
add(a1,
(int
)d1)
<< endl;
//型別強轉為int
cout <<
add(
(double
)a1, d1)
<< endl;
//型別強轉為double
2、顯示例項化
cout << add<
double
>
(a1, d1)
<< endl;
//顯式例項化
還有這種情況需要注意:
//兩個加法函式不構成過載
t add
(const t& left,
const t& right)
intadd
(int left,
int right)
這種,只能在模板推演後可能構成過載,如果用 int 的引數呼叫加法函式,優先呼叫 int 型的,而非模板,因為模板還要推演,效率變低。但是顯式例項化呼叫的是模板。
add(a1, d1); //呼叫int型add
add(a1, d1); //呼叫模板
類模板的定義格式:
template
<
classt1,
classt2,
...,
class
tn>
class 類模板名
;
在stl中的容器都是模板,我們在例項化的時候是這樣寫的:
vector<
int> s;
list<
double
> l;
queue<
float
> q;
類模板例項化與函式模板例項化不同,類模板例項化需要在類模板名字後面跟<>,然後將例項化的型別放在<>中,類模板名字不是真正的類,而例項化的結果才是真正的類。注意:在類中初始化是按需例項化,就是說當物件沒有呼叫某乙個函式時,編譯器不會生成這個函式的**,即使這個函式沒有定義完全或者定義出錯,編譯器也不會報錯。但是當物件呼叫的函式出錯,編譯器就會報錯。 加密初了解
1.對稱式加密1 des d atae ncryption s tandard 安全性較差,一般不建議使用。2 3des 三重des,針對des金鑰長度較短的問題,3des可以實現最少112位 最高168位金鑰長度。3 aes 相比於3des擁有更好的安全性。4 pbe p assword b as...
C 類與物件初了解
在c 中,類的概念類似於結構體,但比結構體內可以定義變數,也可以定義函式。class classname 注意 class date 件宣告 class date cpp檔案定義 include person.h void date show 物件導向的三大特性 封裝,繼承,多型 封裝 將資料和運算...
記初入c 模板元
乙個問題 列印250 包括250 以內的所有素數 第一種方法 自己找出所有的素數,並放入乙個陣列中,可能的一種 如下 include int main 需要自己找,自己算,猝死.列印 for int i 0 i sizeof primes i std cout 第 i 1 個素數是 primes i...