什麼是C++標準模板庫(STL)的概念

C++提供了多種代碼重用機制,在前面介紹派生和繼承時,派生類可以繼承基類中的成員變量和成員函數。模板是另一種代碼重用機制。

有時候在設計程序的時候會遇到這樣一種情況:需要設計的幾個類,其功能都是一樣的,僅僅只是需要操作的數據類型不同。遇到這樣的情況,固然可以將所有的類都設計一遍,但是在C++中,我們有更好的方法:設計一個模板類。假設我們需要創建一個數組類,該數組可能是整型數組,也可能是double類型數組、string類型數組等,爲此我們需要設計一個數組的模板類。

例1:
template< class T >
class array
{
public:
array( int );
T & operator;
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;
}
在本例中,我們定義了一個數組的模板類array,借用該示例,我們來了解一下模板類的一些基本語法。在本例中我們定義模板類array時,前面加上了一句聲明:
template< class T >
該語句稱爲模板頭,可以單獨放在一行,也可以與後面的class array同放在一行,這都沒有關係。模板頭中的“T”我們稱之爲類參數,類參數表示將會以確定的數據類型替代之,任何有效的C++標識符均可以作爲類參數,當然通常我們還是會用“T”來做類參數。

模板頭中template關鍵字和“<”之間可以保留一個空格,但通常這兩者之間不留空格。

對於模板類而言,在類外定義類中的成員函數的時候都需要加上模板頭。同時由於array是個模板類,因此類名是array< T >,故而在類外定義帶參構造函數的完×××式是:
template < class T >
T & array< T >::array( int n )
{
num = new T[n];
length = n;
}
而如果是在類內部定義該函數,則會相對簡單一些:
array( int n )
{
num = new T[n];
length = n;
}
在本例中用到了前面所介紹的很多知識點,例如將默認構造函數置爲private屬性,重載下標操作符,重載輸出操作符等,這些知識點希望能夠仔細領會。

模板類至少有一個類參數,但是可以有多個類參數,每一個類參數前都必須有關鍵字class或者類型名。

例2:
template< class T, class S, class R>
class test
{
public:
S fun( R r);
private:
T x;
};
本例就是一個具有多個類參數的模板類示例。
轉載請註明出處: IMT國際金錢樹

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章