模板:函式模板和類模板
一:函式模板
1:概念 函式模板代表了乙個家族,在使用時被引數化,根據實參型別產生函式的特定型別模板。
2:函式模板格式:
template.,typename tn>
返回值型別 函式名(引數列表){}
template
void
swap
(t& left, t& right)
注意:typename是用來定義模板引數關鍵字,也可以使用class,(切記:不可用struct代替class)
//模板型別引數:盡量設定成引用型別+如果不需要通過形參改變外部實參const
3:函式模板例項化編譯器在編譯期間,根據例項化實參的型別,推演模板引數列表中t的實際型別,根據推演的實際型別生成處理實際型別逼得具體函式。
對於函式部分,編譯分為兩個階段:
1:對函式模板進行簡單的語法檢測
2:根據例項化生成具體**,詳細編譯生成的**
template
t add
(const t& a,
const t& b)
intmain()
自定義型別
template
t add
(const t& a,
const t& b)
class complex
complex operator+
(const complex& c)
const
private:
double _real;
double _image;};
intmain()
4:模板引數匹配原則
乙個非模板函式可以和乙個同名的函式模板同時存在,而且該函式模板還可以例項化為這個非模板函式
int
add(
int a,
int b)
template
t1 add
(const t& a,
const t& b)
intmain()
對於非模板函式和同名函式模板,如果其他條件相同,在呼叫是會優先呼叫非模板函式而不會從該模板產生乙個例項,如果模板可以產生乙個更好匹配的函式,那麼選擇模板
int
add(
int a,
int b)
template
t1 add
(const t1& a,
const t2& b)
intmain()
模板函式不允許自動型別轉換,但普通函式可以進行自動型別轉換
二:類模板
template
class seqlist
seqlist
(size_t n,
const t& data =t(
)):_array
(new t[n]),
_capacity
(n),
_size
(n)}
~seqlist()
}void
pushback
(const t& data)
;void
popback()
; size_t size()
const
size_t capacity()
const
bool empty()
const
t& operator[
](size_t index)
const t& operator[
](size_t index)
const
void
print()
cout << endl;
}private:
t* _array;
size_t _capacity;
size_t _size;};
template
void seqlist::
pushback
(const t& data)
template
void seqlist::
popback()
--_size;
}int
main()
類模板的例項化
類模板例項化與函式模板例項化不同,類模板例項化需要在類模板名字後跟 <>,然後將例項化的型別放在<>中即可,類模板名字不是真正的類,而例項化的結果才是真正的類。
//vector類名, vector才是型別
vector<
int> s1;
vector<
double
>s2;
C 記憶體管理 之 初識allocator
allacator中文稱為 記憶體配置器 通常它是乙個類,負責提供記憶體管理 可能包含記憶體分配 釋放 自動 等能力 相關的服務。例如,我們通過c提供的malloc free即刻提供乙個allocator實作出來 class alloc 注意這裡有看似多餘的引數cb,這完全是為了和後續提供的allo...
C和指標之初識篇
一 基礎細節 1.程式從標準輸入中讀取輸入行並在標準輸出中列印這些輸入行 首先讀取一串列標號,每一行的列標號從0 開始,以乙個負數作為結束標誌,列標號都是成對出現,表示讀取列的範圍。輸入如下 3 7 8 15 1 輸出第3 7列,8 15列qwertyuiopasdfghjkl i love you...
OSPF之初識篇
本人初學tcp ip協議,ospf為重點。現在此地寫下學習逐步歷程 本篇為基礎入門第一步 一 背景 ospf是鏈結狀態協議中最具代表性的協議,鏈結狀態協議與距離向量協議同為動態路由協議的分類 路由分為動態路由和靜態路由,動態路由協議即針對動態路由的協議。路由協議又對路由以及路由表起到了什麼作用呢?以...