9.1 函式模板 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 類模板的定製
與函式模板類似,類模板有時也需要定製,以適應某些特殊情況。類模板的定製也是通過定義補充模板實現的,稱為模板的特例化,每個補充模板就是主模板的乙個特例。
2023年計算機二級C 考點解析 C 流
10.1 c 流的概念 1 c 流的體系結構 要利用c 流,必須在程式中包含有關的標頭檔案,以便獲得相關流類的宣告。為了使用新標準的流,相關標頭檔案的檔名中不得有副檔名。與c 流有關的標頭檔案有 iostream 要使用cin cout的預定義流物件進行針對標準裝置的i o操作,須包含此檔案。fst...
2023年計算機二級C語言考點解析 檔案
16.1 檔案型別指標 file型別指標 c語言中的檔案分緩衝型檔案和非緩衝型檔案兩種,此處只討論緩衝型檔案。對於緩衝型檔案,每個被使用的檔案都在記憶體中開闢乙個區,用來存放檔案的有關資訊 如檔案名字 檔案狀態及檔案當前位置等 這些資訊儲存在有關結構體型別的變數中。該結構體型別由系統定義,取名為fi...
2023年計算機二級C語言考點解析 運算
15.1 位運算的含義及應用 1.位的概念 大多數計算機系統的記憶體儲器是由眾多的儲存單元構成的。在微機中,每個儲存單元是1個位元組,它由8位二進位制數構成,可以表示28 256種資訊,各位的編號從0 7,最左邊的位 第7位 是最高位,最右邊的位 第0位 是最低位。由於二進位制本身的特點,各位上的數...