2016最新計算機二級C++考點解析「模板」

來源:文萃谷 1.35W

  9.1 函數模板

2016最新計算機二級C++考點解析「模板」

1 函數模板的概念、定義與應用

函數模板是一系列相關函數的模型樣板,這些函數的源代碼形式相同,只是所針對的數據類型不同。對於函數模板,數據類型本身成了它的參數,因而是一種參數化類型的函數。聲明一個函數模板的格式是:

template  模板形參表聲明   函數聲明

其中的 模板形參表聲明 是由一個或多個 模板形參 組成(如果是多個,需要用逗號隔開)。每個 模板形參 具有下面幾種形式:

(1)typename 參數名

(2)class 參數名

(3) 類型修飾  參數名

這裏的 參數名 可以是任意的標識符。在這三種形式中,前兩種是等價的:在聲明模板參數時,關鍵字typename與class可以互換。用typename或class聲明的參數稱為虛擬類型參數;而用 類型修飾 聲明的參數則挑為常規參數,在形式上與普通的函數參數聲明相同。格式中的 函數聲明 與一般函數的聲明類似,只是某些類型修飾符被虛擬類型參數所替代。

2 模板實參的省略

在調用一個模板函數時,編譯系統需要足夠的信息來判別每個虛擬類型參數所對應的實際類型,可以從兩個不同的渠道獲得這樣的信息:從模板實參表(用 和 括起來的參數表)或從模板函數實參表(用(和)括起來的參數表),模板實參的信息優先於函數實參的信息。如果從後者獲得的信息已經能夠判定其中部分或全部虛擬類型參數所對應的實際參數,而且它們又正好是參數表中最後的若干參數,則模板實參表中的那幾個參數可以省略。如果模板實參表中的實參都被省略了,則連空表  也可以不要。因此,若x和y都是unsigned型,則addTo unsigned (x,y,9)、addT   (x、y、9)和addTo(x,y,9)三者是等價的。反之,對於某個模板實參,如果從模板函數的實參表中無法獲得同樣的信息,就不能省略;或者雖然能夠獲得同樣的信息,但在它後面還有其他不能省略的實參,則其自身還是不能省略。

下面列舉幾種模板實參不能省略的情況。

(1)從模板函數實參表獲得的信息矛盾。

(2)需要獲得特定類型的返回值,而不管參數的類型如何。

(3)虛擬類型參數沒有出現在模板函數的形參表中。

(4)函數模板含有常規形參。

3 函數模板的定製

對不同的數據類型在處理形式上的統一性是建立模板的基礎。但是,這種統一性是相對的,個別數據類型有可能比較特殊,在處理形式上與大多數數據類型不一致。針對這樣的特殊情況,可以通過重載模板函數進行定製。這樣把重載的模板稱為補充模板,相應地,原模板則稱為主模板。

  9.2 類模板

1 類模板的概念、定義與應用

類模板就是一系列相關類的模型或樣板,這些類的成員組成相同,成員函數的源代碼形式相同,所不同的只是所針對的.類型(成員的類型以及成員函數的參數和返回值的類型)。對於類模板,數據類型本身成了它的參數,因而是一種參數化類型的類,是類的生成器。類模板中聲明的類稱為模板類。

聲明一個類模板的格式是:

template  模板形參表聲明   類聲明

模板形參表聲明 是由一個或多個模板形參組成;與一般的類聲明的不同之處在於,這裏的 類聲明 要用 模板形參表聲明 中聲明的虛擬類型參數來修飾它的某些成員,使模板類獨立於任何具體的數據類型。

在模板外對成員函數的聲明格式是:

template 模板形參表聲明

返回類型  類名   模板形參表  :: 函數名 ( 函數形參表 ) 函數體

其中模板形參表就是由模板形參表聲明中聲明的參數名組成的序列。應注意,類模板的成員函數都是模板函數,因此在模板外聲明成員函數的格式與聲明普通模板函數十分相似。

用類模板定義對象的格式是:

類名   模板實參表    對象名 ;

類名   模板實參表    對象名 ( 構造函數實參表 );

在定義對象的過程中,編譯系統會自動地根據需要生成相應的類定義,這種依據類模板生成類定義的過程稱為類模板的實例化。類模板實例所生成的每一個類定義就是相應類模板的一個實例。

在用類模板定義對象時,由於沒有像函數實參表這樣的額外信息渠道,因此無法按函數模板的方式省略模板實參。但是,可以為類模板的參數設置默認值。具體地説,在定義類模板時,可以為模板形參表聲明的最後若干個參數設置默認值;而這些有默認值的參數中,最後的若干個對應實參可以在定義對象時省略。

3 類模板的派生與繼承

一談到繼承總涉及到兩個類:基類和派生類,它們中任何一個都有可能是模板類,或模板類的實例。下面列出常見的幾種情況。

(1)普通類繼承類模板的一個實例。

可以通過繼承類模板的一個實例來聲明一個類。

(2)模板類繼承普通類。

在聲明一個類模板時,應儘可能將類模板中與虛擬類型參數無關的成員剝離出來,構成一個普通類,作為類模板的基類。因此,類模板繼承普通類的情況是十分常見的。

(3)模板類繼承模板類。

可以通過繼承一個模板類來聲明一個類模板。

(4)模板類繼承模板參數給出的基類。

模板的派生甚至可以繼承一個未知的基類。也就是説,繼承哪個基類由模板參數決定。

3 類模板的定製

與函數模板類似,類模板有時也需要定製,以適應某些特殊情況。類模板的定製也是通過定義補充模板實現的,稱為模板的特例化,每個補充模板就是主模板的一個特例。

熱門標籤