7.2 C++模板類實例化


參考: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 >”。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM