C++ Primer 5th笔记(chap 16 模板和泛型编程) 类模板的成员函数
1. 分類
1.1 定義在類模板內的成員函數
被隱式聲明為內聯函數。
1.2. 類模板外部的成員函數,
類模板的成員函數本身是一個普通函數。但是,類模板的每個實例都有其自己版本的成員函數。因此,類模板的成員函數具有和模板相同的模板參數。因而,定義在類模板之外的成員函數就必須以關鍵字template開始,后接類模板參數列表。
在類外定義一個成員時,必須說明成員屬于哪個類。從一個模板生成的類的名字中必須包含其模板實參。
2. 特性
當我們定義一一個成員函數時,模板實參與模板形參相同。
對于StrBlob的一個給定的成員函數
ret-type StrB1ob: :member-name(parm-ist)
對應的Blob的成員應該是這樣的: .
template <typename T:ret-type Blob: : member-name(parm-list)
2.1 check和元素訪問成員
template <typename T> void Blob<T>: :check(size_ type i, const std: :string &msg) const {if (i >= data->size())throw std: :out_ _of_ range (msg) ; }2.2 下標運算符和back函數用模板參數指出返回類型
template <typename T>T& Blob<T>: :back() {check(0,"back on empty Blob") ;return data->back() ; } template <typename T> T& B1ob<T>: :operator[] (size_ type i) {//如果i太大,check會拋出異常,阻止訪問一個不存在的元素check(i, "subscript out of range") ;return (*data) [i]; }在原StrBlob類中,這些運算符返回string&。而模板版本則返回一個引用,指向用來實例化Blob的類型。
2.3 Blob構造函數
構造函數的定義要以模板參數開始:
template <typename T> B1ob<T>: :Blob() : data (std: :make_ shared<std: :vector<T>>()){}此構造函數分配-一個空vector,并將指向vector的指針保存在data中。如前所述,我們將類模板自己的類型參數作為vector的模板實參來分配vector。
類似的,接受一個initializer_ list參數的構造函數將其類型參數T作為initializer_ list參數的元素類型:
template <typename T> Blob<T>: :Blob(std: :initializer_ list<T> il) :data(std: :make_ shared<std: :vector<T>> (il) ) { }類似默認構造函數,此構造函數分配一個新的vector。在本例中,我們用參數il來初始化此vector. 為了使用這個構造函數,我們必須傳遞給它一一個 initializer_ list, 其中的元素必須與Blob的元素類型兼容:
Blob<string> articles = {"a", "an", "the"};這條語句中,構造函數的參數類型為initializer_ list. 列表中的每個字符串字面常量隱式地轉換為一個 string。
總結
以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 16 模板和泛型编程) 类模板的成员函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ Primer 5th笔记(cha
- 下一篇: Linux 系统运维 文件操作命令