C++ Primer 5th笔记(chap 16 模板和泛型编程) 类模板的成员函数
1. 分類
1.1 定義在類模板內(nèi)的成員函數(shù)
被隱式聲明為內(nèi)聯(lián)函數(shù)。
1.2. 類模板外部的成員函數(shù),
類模板的成員函數(shù)本身是一個普通函數(shù)。但是,類模板的每個實例都有其自己版本的成員函數(shù)。因此,類模板的成員函數(shù)具有和模板相同的模板參數(shù)。因而,定義在類模板之外的成員函數(shù)就必須以關(guān)鍵字template開始,后接類模板參數(shù)列表。
在類外定義一個成員時,必須說明成員屬于哪個類。從一個模板生成的類的名字中必須包含其模板實參。
2. 特性
當(dāng)我們定義一一個成員函數(shù)時,模板實參與模板形參相同。
對于StrBlob的一個給定的成員函數(shù)
ret-type StrB1ob: :member-name(parm-ist)
對應(yīng)的Blob的成員應(yīng)該是這樣的: .
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函數(shù)用模板參數(shù)指出返回類型
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構(gòu)造函數(shù)
構(gòu)造函數(shù)的定義要以模板參數(shù)開始:
template <typename T> B1ob<T>: :Blob() : data (std: :make_ shared<std: :vector<T>>()){}此構(gòu)造函數(shù)分配-一個空vector,并將指向vector的指針保存在data中。如前所述,我們將類模板自己的類型參數(shù)作為vector的模板實參來分配vector。
類似的,接受一個initializer_ list參數(shù)的構(gòu)造函數(shù)將其類型參數(shù)T作為initializer_ list參數(shù)的元素類型:
template <typename T> Blob<T>: :Blob(std: :initializer_ list<T> il) :data(std: :make_ shared<std: :vector<T>> (il) ) { }類似默認構(gòu)造函數(shù),此構(gòu)造函數(shù)分配一個新的vector。在本例中,我們用參數(shù)il來初始化此vector. 為了使用這個構(gòu)造函數(shù),我們必須傳遞給它一一個 initializer_ list, 其中的元素必須與Blob的元素類型兼容:
Blob<string> articles = {"a", "an", "the"};這條語句中,構(gòu)造函數(shù)的參數(shù)類型為initializer_ list. 列表中的每個字符串字面常量隱式地轉(zhuǎn)換為一個 string。
總結(jié)
以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 16 模板和泛型编程) 类模板的成员函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ Primer 5th笔记(cha
- 下一篇: C++ Primer 5th笔记(cha