參考:http://www.weixueyuan.net/view/6399.html
總結:
array < int >表明用int類型來代替模板類中的類參數“T”,編譯器會將模板類array中所有的類參數T都用int來代替。
我們稱array < int >和array < double >成為模板類的實例。
我們在例1中創建的對象A是屬於模板類實例化后的類的,而不是屬於模板類的。換言之模板類不進行實例化就不能創建對象。
另外模板類可以以參數的形式出現在函數的參數列表中,如果參數列表中有模板類,則函數前面必須加上模板頭,在例1中的模板頭為“template< class T >”。
我們可以通過“< >”指定一種數據類型,從而創建出一個模板類的實例。有了前面定義的模板類,如果我們想創建一個int數組可以按照如下方式使用模板類:
array < int > a(10);
array < int >表明用int類型來代替模板類中的類參數“T”,編譯器會將模板類array中所有的類參數T都用int來代替。例如類中的私有成員變量“T * num;”會被替換為“int * num;”。對類中的成員函數也會進行相同的替換,如“T & operator[]( int );”將會被替換為“int & operator[]( int );”。
如果我們定義對象:
array < double > D(10);
則模板類中所有的類參數“T”都將被換為double。我們稱array < int >和array < double >成為模板類的實例。使用這些實例就與使用普通類是一樣的。
例1:
#include <iostream> using namespace std; template< class T > class array { public: array( int ); T & operator[]( int ); const T & operator[] ( int )const; int getlen() const { return length; } ~array(); private: array(){}; int length; T * num; }; template < class T > array< T >::array( int n ) { num = new T[n]; length = n; } template < class T > array< T >::~array() { delete[] num; } template< class T > T & array< T > ::operator[] ( int i ) { if( i < 0 || i >= length ) throw string( "out of bounds" ); return num[i]; } template< class T > const T & array< T > ::operator[] (int i) const { if( i < 0 || i >= length) throw string( "out of bounds" ); return num[i]; } template< class T > ostream & operator<<( ostream & out, const array <T> & A ) { for(int i=0; i < A.getlen(); i++) out<< A[i] << " "; return out; } int main() { array< int > A(10); for(int i = 0; i < 10; i++) { A[i] = 2*i; } cout<<A<<endl; return 0; }
本例是一個完整的模板類示例,在該例中我們定義了一個array模板類,在主函數中我們對其進行了實例化,“array< int > A(10);”實例化之后創建了一個對象A,該對象是一個包含10個元素的整型數組。之后用一個for循環給數組賦初值,由於我們重載了下標操作符,因此可以憑借下標直接訪問相應的數組元素。之后直接輸出A數組的所有元素,此時調用的是輸出操作符重載函數。
我們在例1中創建的對象A是屬於模板類實例化后的類的,而不是屬於模板類的。換言之模板類不進行實例化就不能創建對象。
例2:
Arrar A(10); Array< T > A(10); Template< class T > Array <T> A(10);
在本例中,三種定義對象的方式都是無效的,模板類不進行實例化是無法創建對象的。
另外模板類可以以參數的形式出現在函數的參數列表中,例如例1中的輸出操作符重載函數“template< class T > ostream & operator<<(ostream & out, const array <T> & A)”,該函數的第二參數是array <T>的引用,如果參數列表中有模板類,則函數前面必須加上模板頭,在例1中的模板頭為“template< class T >”。