day 12 模板和標準模板庫

2021-08-07 02:24:00 字數 3397 閱讀 5427

二函式模板

三類模板

資料的儲存形式、計算規則、訪問方式

/* 儲存形式 */

int a = 1;

char* d = null;

/* 計算規則 */

++a; // a = 2

++d; // d = 4(32位機器)

/* 訪問方式 */

student e("張飛", 20);

cout << e.m_age

<< endl;

由語言編譯器處理型別,生成與之相一致的機器指令,在執行階段不可改變;

/* 動態型別 */

a = 100

// a:int

a = 3.14

// a:float

a = "hello,world!"

// a:string

1)靜態型別特點

優點:

a. 安 全 性:更細緻的資料型別檢查;

b. 執行效能:執行時不需要考慮變數的型別和處理方式;(犧牲編譯時間)

缺點:

不夠靈活(缺乏泛型性):不適合於表達與資料型別無關的演算法;

參見:typed.cpp

int

sum(int a, int b)

cout << sum(100, 200) << endl; // 300

cout << sum("100", "200") << endl; // error!

def sum(a, b):

return a+b

printf(sum(100,200)) // 300

printf(sum("100", "200")) // 100200

借助於引數巨集(巨集函式),可以在某種程度上擺脫源自靜態型別的約束,但同時也帶來由於缺乏型別安全機制的風險;

參見:untype.cpp

利用巨集定義以型別無關的方式描述泛型化的演算法函式框架,通過預處理器將其擴充套件為針對具體型別的函式實現,既保證邏輯的型別無關性,同時兼顧源自靜態型別的安全性;

參見:macro.cpp

template

返回型別 函式模板名(呼叫形參表)

功能:在函式模板的返回型別、呼叫形參表和函式體中都可以引用該模板的型別形參作為識別符號的宣告;

template

a func(b arg)

注意:

乙個函式模板本身並不表示函式,其意義在於為編譯器提供一種生成函式**的框架,在編譯器看到具體型別實參以後,結合模板定義中的型別形參,才能得到真正意義上的具體函式;

函式模板名《型別實參1, 型別實參2, ..>(呼叫實參表);
例項化:

編譯器將函式模板變成具體函式的過程一般被稱為函式模板的例項化;

參見:ftmpl.cpp

1)型別形參只要是合法的識別符號即可,沒有其它限制;習慣上常用"t"或者"xx_t"的形式表示;

2)型別實參既可以是基本型別,也可以是類型別,但是無論怎樣,該型別必須滿足模板內部的實現要求;

參見:targ.cpp

int add(int, int);  // 函式宣告

void foo(void)

int add(int x, int y)

1)普通函式

非模板化的普通函式,在整個**的生成(build)過程中只在定義時被編譯一次,由鏈結器負責在呼叫語句和編譯後的函式指令集之間建立關聯;

2)模板函式

函式模板則至少要被編譯兩次,一次是在例項化之前,編譯器會做與型別無關的語法檢查,若無誤則生成該函式模板的內部表示:只有在編譯器看到對該函式模板的呼叫語句時,才會根據所提供的型別實參與內部表示中的型別形參相結合,完成二次編譯,並在型別相關的語法檢查通過之後生成二進位制機器指令。

參見:typename.cpp

如果函式模板呼叫引數 (圓括號裡的引數)  的型別相關於該模板的模板引數 《尖括號裡的引數》 ,那麼即使不顯式指明模板的型別實參,編譯器也可以依據函式呼叫引數型別一致的原則,隱式推斷出模板型別引數的具體型別。但是,隱式推斷也存在一定風險,特別是在推斷型別和**設計者期望型別不一致的情況下。

參見:deduction.cpp

和普通函式一樣,在同乙個作用域中函式名相同,參數列不同的函式模板之間,以及函式模板和普通函式之間,也可以構成過載關係;過載匹配的條件,除了要滿足型別一致的要求外,針對型別的約束性越強的版本也會被編譯器優先選擇;

普通函式》半模板》全模板

參見:overload.cpp

如果乙個類的成員變數、成員函式、成員型別,甚至基類包含引數化的型別,那麼該類就是乙個類模板;

template

class 類模板名[:繼承方式 基類1, ..]

;

template

class myclass:public b

typedef t* tp;

};

類模板名《型別實參1, 型別實參2, ..> 物件(構造實參);

類模板名《型別實參1, 型別實參2, ..> &引用 = 物件;

類模板名《型別實參1, 型別實參2, ..> *指標 = &引用;

兩步例項化:

類模板 - 例項化(編譯期間:編譯期) >> 類 - 例項化(執行期間:處理器) >> 物件

注意:

類模板不能隱式推斷,而必須顯示例項化;原則上,任何時候類模板本身都不能當做型別看待,只有它的某個例項化類才具備型別語義;

參見:ctmpl.cpp

標準模板庫( ) 介紹標準模板庫

標準模板庫就是類與函式模板的大集合。stl共有6種元件 容器,容器介面卡,迭代器,演算法,函式物件和函式介面卡。1 容器 容器是用來儲存和組織其他物件的物件。stl容器類的模板在標準標頭檔案中定義。1 序列容器是上面圖中的前三類 容器的操作 2 deque容器 非常類似vector,且支援相同的操作...

標準模板庫

c primer plus是乙個精心設計的,在今天的乙個最重要的和廣泛使用的程式語言的完整教程。乙個方便和易於使用的自學指南,這本書是適當的節目都認真的學生以及已經精通其他語言的開發人員。第六版c primer plus已更新和擴大覆蓋在c 的最新進展,包括新的c 11標準的詳細介紹。作家和教育家史...

標準模板庫

vector iterator pd vector scores pd scores.begin pd 22.3 pd pd scores.end 指向容器最後乙個元素後面的那個元素scores.erase scores.begin scores.begin 2 第乙個迭代器指向區間的起始處,第二個...