C 基礎教程物件導向(學習筆記(72))

2021-09-02 01:55:51 字數 1819 閱讀 2166

模板允許我們使用佔位符型別編寫函式或類,以便我們可以使用不同的型別來模擬函式或類的相同版本。已例項化的函式或類稱為函式或類例項。

所有模板函式或類必須以模板引數宣告開頭,該宣告告訴編譯器以下函式或類是模板函式或類。在模板引數宣告中,指定了模板型別引數或表示式引數。模板型別引數只是佔位符型別,通常名為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

解決方案

#include template class pair1

t& first()

const t& first() const

t& second()

const t& second() const };

int main()

2)編寫乙個pair類,允許您為該對中的兩個值中的每乙個指定單獨的型別。

注意:我們命名此類與前乙個類不同,因為c ++目前不允許「過載」僅在模板引數的數量或型別方面不同的類。

以下程式應該有效:

int main()

並列印:

解決方案

#include template class pair

t& first()

const t& first() const

s& second()

const s& second() const };

int main()

3)字串值對是一種特殊型別的對,其中第乙個值始終是字串型別,第二個值可以是任何型別。編寫乙個名為stringvaluepair的模板類,它繼承自部分專用的pair類(使用std :: string作為第一種型別,並允許使用者指定第二種型別)。

應執行以下程式:

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...