CPP學習備忘 12 模板

2021-06-02 14:39:56 字數 2131 閱讀 1912

模板使程式設計師能夠快速建立具有型別安全的類庫集合和函式集合,以方便更大規模的軟體開發。c++的stl全賴於模板實現,模板是c++物件導向程式設計的重要補充。

函式模板的定義形式為:

template《型別參數列》

返回型別 函式模板名(資料參數列)

函式模板定義體;

函式模板不是函式,它是以具體的型別為實參來生成函式體的模板。函式模板定義被編譯時,不會產生任何執行**。函式模板定義只是對未來生成的函式體的描述,表示它每次能單獨處理在模板形參表中說明的資料型別。第一次使用函式模板時,會觸發編譯器產生乙個對應函式模板的函式定義。

乙個函式模板可以生成許多不同的模板函式,這些不同模板函式並不是過載函式,因為其函式名稱各不相同,如swap不同於swap。

模板函式呼叫是尋求函式模板的型別引數匹配,型別實參與型別形參的匹配規則與函式的資料實參型別與資料形參型別匹配規則不同。型別實參與型別形參匹配規則更苛刻。模板型別引數沒有隱式轉換之說。

const t& a與t const& a等價;

對於常量引用型引數,可以通過顯式模板型別指定來規定呼叫的**。對於呼叫中的幾個資料實參型別不同,而資料形參型別卻要求相同時,用顯式模板型別指定的方法是必要的,否則模板引數將拒絕匹配。

顯式模板型別指定可以顯示指定模板的型別實參,從而也就規定了資料形參的型別,免去了資料實參的演繹,同時也給出模板函式名。實際上就是使模板函式成為了普通函式,因而服從普通函式的匹配規則。

當然還可以預先將資料實參轉換成預料的資料實參演繹所需要的型別。如:

template

t const& max(t const& a,t const&b){

return aint main(){

int ia=3;

double db=5.0;

std::cout<(ia,db)<<」\n」;

std::cout<(ia),db)<<」\n」;

被啟用的例項化只例項化類模板的定義部分,不將成員函式的定義部分一起例項化,直到後面首次遇到模板類成員函式呼叫時,才迫不得已進行類模板的成員函式例項化。所以,類模板成員函式的例項化是被單獨啟用的。

可以通過顯式例項化的方式獲得模板類和模板函式。顯式例項化是通過引入乙個template來獲得的,顯式例項化沒有拖沓的毛病,它會馬上將所有的類模板的成員函式都例項化成對應的模板成員函式。例如:

template list;

listdlist;

模板機制規定,如果乙個呼叫既匹配普通函式,又匹配模板函式,則先匹配普通函式。

模板類以模板名打頭後跟尖括號括起來的型別實參。

類模板是一種模板,它通過在類定義上鋪設型別引數的形式,表示具有相似操作的系列類。類模板名簡稱模板名,它是模板定義中的主體名稱而跟在class後面,如templateclass list中的list;

模板引數可以被預設。如向量容器實際有兩個模板引數,只不過第二個引數是預設引數,向量的宣告形式為:

template>

class vector;

向量類模板的第二個引數是記憶體分配器,是stl提供的。

如果不想用預定義的類模板來生成模板類,而是以該模板類名自己專門重寫乙個模板類,則得到模板鑄件。得到模板鑄件的過程,稱為模板定做。

模板定做時,必須以template<>開始,然後在class後跟類模板名,即定義需要定做的類。定做時,成員可以在原先類模板的基礎上隨心所欲的增刪,因此,定做的實現可以與類模板的實現完全不同。定做的成員函式不再是模板函式,而是普通函式。類模板中的成員中的型別引數t將被定做的型別取代。

如://以下為模板定做

template<>

class list{

void list::add(cat& n){//與類模板的成員函式實現上有差異

模板定做不一定要全部定做,如果乙個類模板的型別引數多於乙個,而定做其中一部分型別參為確定的型別,則稱為區域性定做。模板一旦區域性定做,則產生的模板鑄件就仍然是類模板。

以分離方式組織模板**,即將類模板定義與類模板實現分離,分別寫入標頭檔案和定義檔案,在使用模板的原始檔中包含模板宣告的標頭檔案,也就是與函式或類的使用方式一致。但是在模板宣告和模板定義的template關鍵字前要加export關鍵字。

利用模板可以實現靜多型:函式模板的模板引數不同,其函式體中同一操作所反映的行為也不同。區別於基於虛函式機制的同一類繼承體系的動多型。

CPP學習備忘 9 多型

雖然從廣義上說,資料型別是資料結構在一定的程式語言中的描述形式,但實際上描述群體資料 容器 的抽象資料型別才是資料結構的真正體現。類定義不占用任何記憶體空間,也沒有任何物件的預處理,所以沒有任何操作上的開銷。乙個操作隨著所傳遞或 的物件型別的不同能夠做出不同的反應,其行為模式稱為多型。c 中採用一種...

cpp備忘摘錄

staticconststatic const const static成員初始化 四種cast 隱式轉換與explicit 類建構函式 類的static函式 構造析構函式 虛函式與構造析構函式 int a1 3 non const data const int a2 a1 const data i...

CPP學習備忘 1 基本程式設計語句

switch括號中的表示式只能是整型 字元型或列舉型表示式。case後面的常量表示式之型別必須與其匹配。流iostream主管資料型別的識別工作和溝通作業系統,全權負責把流中的資料送到對應的裝置上。流的格式操作亦可直接以輸出流的方式操作。常用的流狀態 showpos 在正數 包括0 之前顯示 號 l...