C/C++編程筆記:C++ 模板詳解(二)類(lèi)模板的概念和基本使用方式
與函數(shù)模板類(lèi)似地《C/C++編程筆記:C++模板詳解(一)函數(shù)模板的概念和特性》(UP兩天前發(fā)布的文章),類(lèi)也可以被一種或多種類(lèi)型參數(shù)化。例如,容器類(lèi)就是一個(gè)具有這種特性的典型例子,它通常被用于管理某種特定類(lèi)型的元素。只要使用類(lèi)模板,我們就可以實(shí)現(xiàn)容器類(lèi),而不需要確定容器中元素的類(lèi)型。
一、類(lèi)模板的實(shí)現(xiàn)
在這篇博文中,我們使用Stack作為類(lèi)模板的例子。
(1.1) 類(lèi)模板的聲明

如上所示,類(lèi)模板的聲明和函數(shù)模板的聲明很相似:在聲明之前,我們先聲明參數(shù)類(lèi)型的標(biāo)識(shí)符

當(dāng)然,也可以使用關(guān)鍵字class來(lái)代替typename。在類(lèi)模板的內(nèi)部,類(lèi)型T可以像其它的類(lèi)型一樣,用于聲明成員變量和成員函數(shù)。在這個(gè)例子中,類(lèi)的類(lèi)型是Stack<T>,其中T是模板參數(shù)。因此,當(dāng)在聲明中需要使用該類(lèi)的類(lèi)型時(shí),我們必須要使用Stack<T>。例如,如果要聲明自己實(shí)現(xiàn)的拷貝構(gòu)造函數(shù)和賦值運(yùn)算符,那就應(yīng)該這樣來(lái)編寫(xiě):

然而, 當(dāng)需要使用類(lèi)名而不是類(lèi)的類(lèi)型時(shí),就應(yīng)該只用Stack。例如,當(dāng)指定類(lèi)的名稱,或是需要編寫(xiě)構(gòu)造函數(shù)、析構(gòu)函數(shù)時(shí),就需要使用Stack。
(1.2) 類(lèi)模板的實(shí)現(xiàn)
為了定義類(lèi)模板的成員函數(shù),我們必須要指定該成員函數(shù)是一個(gè)函數(shù)模板(使用template<typename T>),而且還需要使用這個(gè)類(lèi)模板的完整類(lèi)型限定運(yùn)算符Stack<T>::。因此,成員函數(shù)push的完整定義如下:

其它成員函數(shù)的實(shí)現(xiàn)也是類(lèi)似的;和普通類(lèi)定義相同,完全也可以將成員函數(shù)的實(shí)現(xiàn)內(nèi)聯(lián)地寫(xiě)在類(lèi)中,例如:

二、類(lèi)模板的使用
參見(jiàn)如下的main函數(shù)代碼:

注意:只有那些被調(diào)用了的成員函數(shù),才會(huì)產(chǎn)生這些函數(shù)的實(shí)例化代碼。
所以,針對(duì)這個(gè)類(lèi)模板,缺省的構(gòu)造函數(shù)、push、top方法都針對(duì)int、std::string進(jìn)行了實(shí)例化。然而,pop方法只提供了std::string的實(shí)例化。這樣做的好處是:
(1)可以節(jié)省時(shí)間和空間。
(2)對(duì)于那些未能提供所有成員函數(shù)中所有操作的類(lèi)型,也可以使用該類(lèi)型來(lái)實(shí)例化類(lèi)模板。
另一方面,如果類(lèi)中含有靜態(tài)成員,那么用來(lái)實(shí)例化的每種類(lèi)型,都會(huì)實(shí)例化這些靜態(tài)成員。

學(xué)習(xí)C/C++編程知識(shí),歡迎關(guān)注UP一起成長(zhǎng)!