【本節內容】
泛型程式設計
函式模板
類模板1.泛型程式設計
首先問大家乙個問題,如果我們想實現乙個通用的交換函式,該怎麼做呢?
我想大家會想到用過載,將不同型別引數的函式都寫出來,這是乙個解決的辦法,不過emmm…自己看~
void swap(int &left, int &right)
void swap(double &left,double &right)
void swap(char &left,char &right)
如果這樣寫的話,存在以下幾個問題:
過載的函式僅僅只是引數型別不同,使得**的復用率太低,而且只要有新的型別出現 我們就要增加乙個對應的函式,這未免太麻煩了吧
**的可維護性太差,只有乙個函式出錯時可能所有的過載都要重新寫一遍,這也太可怕了!
那麼我們應該怎麼解決呢?
這時懶人們就想,那能不能直接告訴編輯器乙個模子,讓編輯器根據不同的型別利用該模子生成屬於自己的**呢?巧的是,果然有這樣的好事!!
泛型程式設計:編寫與型別無關的通用**,是**復用的一種手段,模板是泛型程式設計的基礎。
模板主要有兩種:函式模板和類模板
2.函式模板
2.1 概念:函式模板代表了乙個函式的家族,該函式模板與型別無關,在使用時才被引數化,根據實參型別產生函式的特定型別版本。
2.2 函式模板的格式:
template
返回值型別 函式名 (引數列表){}
例如:
template void swap(t& left, t& right)
注意:typename 是用來定義模板引數型別的關鍵字,也可以使用class(但不能用struct!!)
2.3 函式模板的原理
模板本身並不是函式,是編譯器用使用方式產生特定具體型別函式的模具。所以模板就是將本來應該我們做的重複的事情交給了編譯器去完成。
在編譯過程中,對於模板的使用,編譯器根據傳入的實參型別推演生成對應型別的函式以供我們的呼叫。
例如剛才的那段**,當我們用int 型別的實參使用函式模板時,編譯器通過對實參型別的推演,將t確定為int 型別,然後產生乙份專門處理int型別的**,從而實現。對於其他型別也都一樣的處理過程。
2.4 函式模板的例項化
用不同型別的引數使用函式模板時,稱為函式模板的例項化。
模板函式的例項化包括兩種:隱式例項化,顯式例項化。
1)隱式例項化: 讓編譯器根據實參推演模板引數的實際型別
templatet add(const t&left,const t&right)
int main()
add(a1, b2);
//這句無法通過編譯,因為在編譯期間,當編譯器看到該例項化時,需要推演其實參型別。此時它通過a1將t推演為int,通過b2將t推演為double,但模板的引數列表中只有乙個t,所以編譯器會因無法確定t的型別而報錯
注意:在模板中,編譯器一般不會進行型別轉化操作,因為一旦轉化出問題,編譯器就要背黑鍋
因為無法推演型別而出錯時的處理方式有兩種:
a.使用者強制轉化add(a1, (int)b2);
b.使用顯示例項化add(a1, b2);
2.顯式例項化: 在函式名後的<>中指定模板引數的實際型別
int main()
若型別不匹配,編譯器會嘗試進行隱式型別轉換,如果無法轉換成功編譯器將會報錯。
2.5 模板引數的匹配原則
a.乙個非模板函式可以和乙個同名的函式模板同時存在,而且該函式模板還可以被例項化成這個非模板函式
//通用處理加法的函式
templatet add(const t&left,const t&right)
// 只處理int型別的加法
int add(const int &left, const int &right)
void test1()
b.對於非模板函式和同名函式,如果其他條件相同,在呼叫時會優先呼叫非模板函式,如果模板可以產生乙個具有更好匹配的函式就選擇模板
void test2()
c.模板函式不允許自動型別轉換,但普通函式可以發生自動型別轉換
3.類模板
3.1 類模板的定義格式
templateclass 類模板名
;
templateclass vector
~vector(); //用於演示 在類中宣告,在類外定義
private:
t* _pdata;
size_t _size;
size_t _capacity;
};// 注意:類模板中的函式放在類外定義時,需要加模板引數列表
templatevector::~vector()
}
注意:vector不是具體的類,是編譯器根據被例項化的型別生成具體類的模具3.2 類模板的例項化類模板的例項化與函式模板的例項化不同,類模板的例項化需要在類模板名字後跟<>,然後將例項化的型別放在<>中。
類模板的名字不是真正的類,而例項化的結果才是真的類。
在剛才的**中,vector 是類名,下面vector< int >才是型別
void test()
cout << endl;
}
希望對模板有更深了解的可以參考我的下篇部落格模板高階 ,進一步的學習。 模板初階 函式模板和類模板
1.函式模板 格式 template.typename class tn include using namespace std template t add const t left,const t right template void swap const t left,const t rig...
類模板,模板類和函式模板,模板函式
單整數類 雙整數類 所以c艹跟其他強型別語言為我們提供了乙個所謂模版功能 變數型別 整數 類模板的重點是模板。表示的是乙個模板,專門用於產生類的模子。例子 1 template 2 class vector 3 使用這個vector模板就可以產生很多的class 類 vector vector ve...
C 函式模板和類模板
一 函式模板 c 提供了函式模板 function template 所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會...