模板允許我們使用佔位符型別編寫函式或類,以便我們可以使用不同的型別來模擬函式或類的相同版本。已例項化的函式或類稱為函式或類例項。
所有模板函式或類必須以模板引數宣告開頭,該宣告告訴編譯器以下函式或類是模板函式或類。在模板引數宣告中,指定了模板型別引數或表示式引數。模板型別引數只是佔位符型別,通常名為t,t1,t2或其他單個字母名稱(例如s)。表示式引數通常是整數型別,但可以是函式,類物件或成員函式的指標或引用。
拆分模板類定義和成員函式定義不像普通類那樣工作 - 您不能將類定義放在.cpp檔案中的頭和成員函式定義中。通常最好將所有這些檔案儲存在標頭檔案中,並在類下面使用成員函式定義。
當我們想要覆蓋特定型別的模板化函式或類的預設行為時,可以使用模板特化。如果覆蓋了所有型別,則稱為完全特化。類還支援部分特化,其中只有一些模板化引數是專用的。從c ++ 14開始,函式不支援部分特化。
c ++標準庫中的許多類都使用模板,包括std :: array和std :: vector。模板通常用於實現容器類,因此容器可以編寫一次並與任何適當的型別一起使用。
quiz time:
1)定義成對傳輸的資料有時很有用。編寫乙個名為pair1的模板化類,允許使用者定義乙個模板型別,該模板型別用於該對中的兩個值。以下函式應該有效:
並列印:int main()
pair: 5 8
pair: 2.3 4.5
解決方案
2)編寫乙個pair類,允許您為該對中的兩個值中的每乙個指定單獨的型別。#include template class pair1
t& first()
const t& first() const
t& second()
const t& second() const };
int main()
注意:我們命名此類與前乙個類不同,因為c ++目前不允許「過載」僅在模板引數的數量或型別方面不同的類。
以下程式應該有效:
並列印:int main()
解決方案
3)字串值對是一種特殊型別的對,其中第乙個值始終是字串型別,第二個值可以是任何型別。編寫乙個名為stringvaluepair的模板類,它繼承自部分專用的pair類(使用std :: string作為第一種型別,並允許使用者指定第二種型別)。#include template class pair
t& first()
const t& first() const
s& second()
const s& second() const };
int main()
應執行以下程式:
並列印:int main()
解決方案
#include #include template class pair
t& first()
const t& first() const
s& second()
const s& second() const };
template class stringvaluepair : public pair};
int main()
C 基礎教程物件導向(學習筆記5(2))
在編寫具有多個建構函式的類 大多數建構函式 時,必須為每個建構函式中的所有成員指定預設值會導致冗餘 如果更新成員的預設值,則需要觸控每個建構函式。從c 11開始,可以直接為普通類成員變數 不使用static關鍵字的變數 提供預設初始化值 class rectangle void print int ...
C 基礎教程物件導向(學習筆記(23))
過載一元運算子 與您目前看到的運算子不同,正 負 和邏輯非 運算子都是一元運算子,這意味著它們只能在乙個運算元上執行。因為它們僅對它們所應用的物件進行操作,所以通常將一元運算子過載實現為成員函式。所有三個運算元都以相同的方式實現。讓我們看一下我們如何在前面的例子中使用的cents類上實現operat...
C 基礎教程物件導向(學習筆記(24))
過載比較運算子相對簡單,因為它們遵循我們在過載其他運算子時看到的相同模式。因為比較運算子都是不修改左運算元的二元運算子,所以我們將使過載的比較運算子宣告為友元函式。這是乙個帶有過載運算子 和operator!的car類的示例。include include class car friend bool...