2.類模板
為什麼我們需要學習模板呢?話不多說,看下列**
void
swap
(int
& left,
int& right)
void
swap
(double
& left,
double
& right)
void
swap
(char
& left,
char
& right)
intmain()
看完是不是覺得**很冗餘,這時候模板是可以幫助我們減少**重複的。簡化後的**如下:
函式模板就相當於是乙個函式家族。
template
<
typename t>
void
swap
(t& left, t& right)
注意:typename是用來定義模板引數關鍵字,也可以使用class(切記:不能使用struct代替class)思考:編譯器實現時,是只呼叫這函式模板乙個麼?
不是的,在彙編下可以看出,是模板例項化出各個函式來使用。
在編譯器編譯階段,對於模板函式的使用,編譯器需要根據傳入的實參型別來推演生成對應型別的函式以供呼叫。比如:當用double型別使用函式模板時,編譯器通過對實參型別的推演,將t確定為double型別,然後產生乙份專門處理double型別的**,對於字元型別也是如此。
用不同型別的引數使用函式模板時,稱為函式模板的例項化。模板引數例項化分為:隱式例項化和顯式例項化。
template
<
class
t>
t add
(const t& left,
const t& right)
intmain()
int
main
(void
)
乙個非模板函式可以和乙個同名的函式模板同時存在,而且該函式模板還可以被例項化為這個非模板函式
// 專門處理int的加法函式
intadd
(int left,
int right)
// 通用加法函式
template
<
class
t>
t add
(t left, t right)
void
test()
對於非模板函式和同名函式模板,如果其他條件都相同,在調動時會優先呼叫非模板函式而不會從該模板產生出乙個例項。如果模板可以產生乙個具有更好匹配的函式, 那麼將選擇模板
// 專門處理int的加法函式
intadd
(int left,
int right)
// 通用加法函式
template
<
classt1,
class
t2>
t1 add
(t1 left, t2 right)
void
test()
模板函式不允許自動型別轉換,但普通函式可以進行自動型別轉換
int
add(
int left,
int right)
// 通用加法函式
//template
//t1 add(t1 left, t2 right)
//void
test()
intmain()
template
<
class
t>
t add
(t left, t right)
void
test()
intmain()
template
<
classt1,
classt2,
...,
class
tn>
class 類模板名
;
// 動態順序表
// 注意:vector不是具體的類,是編譯器根據被例項化的型別生成具體類的模具
template
<
class
t>
class
vector
// 使用析構函式演示:在類中宣告,在類外定義。
~vector()
;void
pushback
(const t& data)
;void
popback()
;// ...
size_t size()
t&operator
(size_t pos)
private
: t* _pdata;
size_t _size;
size_t _capacity;};
// 注意:類模板中函式放在類外進行定義時,需要加模板引數列表
template
<
class
t>
vector::~
vector()
類模板例項化與函式模板例項化不同,類模板例項化需要在類模板名字後跟<>,然後將例項化的型別放在<>中即可,類模板名字不是真正的類,而例項化的結果才是真正的類。
// vector類名,vector才是型別
vector<
int> s1;
vector<
double
> s2;
C 模板函式 模板類的使用
模板函式 include include include using namespace std template inline t const max t const a,t const b int main int argc,char ar template void stack push t ...
C 模板函式,模板類
模板如字面的意思為模具模板,並不是乙個正真的物體。例如,在編寫比較兩個數大小的 中,我們可能要比較兩個整數的大小,也能需要比較浮點數等等大小。在這些 中,基本的邏輯都是相同的,只是比較數的型別不同。此時我們就可以用模板這個概念來完成對於不同型別的引數而相同的邏輯的操作。而模板會根據實際的引數型別推演...
模板 函式模板 類模板
模板主要是針對資料型別,不同的資料型別卻具有相同的操作形式,比如說,同樣是做入棧,int和double由於資料型別不一樣,需要做兩個棧才能滿足需求,誠然可以使用函式過載,但是終歸棧的操作是一樣的,只是資料型別不一樣。所以在此基礎上,假設,我們首先將所有的資料型別視為乙個大類,將它引數化,等到要用的時...