C++模板淺談
阿新 • • 發佈:2018-12-22
一,模板介紹
由來:在C語言中,每次使用資料結構的時候都得自己寫一個,而且還不支援多個型別的使用,必須重新換一個型別適應要求。
所以C++就提出模板的概念,它要能支援多種型別的使用,而不是隻能用一種型別,並且給你放在庫裡,你可以直接使用。
二,函式模板
1,為什麼不用過載替代模板?
過載雖然可以實現多種型別的使用,但是過載複用性太低,每次有新的型別都需要重新加入。
程式碼維護性低,一個程式碼出錯可能影響其他的過載。
2,函式模板概念
函式模板代表了一個函式家族,該函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的特定 型別版本
3.函式模板格式
template<typename T1, typename T2,......,typename Tn> 返回值型別 函式名(引數列表){}
注意:typename是用來定義模板引數關鍵字,也可以使用class(切記:不能使用struct代替class)
4.模板引數例項化
隱式型別例項化:不告訴模板具體例項,讓它自己去推導,但是不能有多個型別,編譯器不知道該推成哪一個。
顯示型別例項化:ADD(a,(int)b) 可以用這種方式,也可以顯示給定 ADD<int> (a,b);
注意:如果型別不匹配,編譯器會嘗試進行隱式型別轉換,如果無法轉換成功編譯器將會報錯。
5,對於非模板函式和同名函式模板,如果其他條件都相同,在調動時會優先呼叫非模板函式而不會從該模 板產生出一個例項。如果模板可以產生一個具有更好匹配的函式, 那麼將選擇模版
6.一個非模板函式可以和一個同名的函式模板同時存在,而且該函式模板還可以被例項化為這個非模板函 數
三,vector的簡單模板實現
// 動態順序表 template<class T> class Vector { public : Vector(size_t capacity = 10) : _pData(new T[capacity]) , _size(0) , _capacity(capacity) {} // 使用解構函式演示:在類中宣告,在類外定義。 ~Vector(); void PushBack(const T& data) { // _CheckCapacity(); _pData[_size++] = data; } void PopBack() { --_size; } size_t Size() { return _size; } T& operator[](size_t pos) { assert(pos < _size); return _pData[pos]; } private: T* _pData; size_t _size; size_t _capacity; }; template <class T> Vector<T>::~Vector() { if(_pData) { delete[] _pData; } }