1. 程式人生 > >C++模板淺談

C++模板淺談

一,模板介紹

由來:在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; 
   }
 }