《C 高階高階教程》 第六章模板與標準模板庫

2021-09-27 03:13:54 字數 1891 閱讀 1206

目錄

6.1 關於模板引數

6.2 模板例項化​

6.3 函式宣告對函式模板例項化的遮蔽

6.4 將模板宣告為友元

6.5 模板與分離式編譯

6.6 關於模板特化

6.7 輸入輸出迭代子的用法

6.8 bitset的簡單用法

6.9 typename的用法

6.10 什麼是防函式

6.11 什麼是引用計數

模板是怎麼來的呢?為什麼要引入模板?

前面我們說過c++比c語言多了乙個函式過載,考慮這樣一種場景,就是乙個函式,除了輸入型別或者個數不同,其他處理邏輯都一樣,如果採用函式衝在實現,需要寫多分非常類似的函式。 那為了簡化這種場景,就引入了模板。

普通的模板有模板函式和模板類。就是處理這種情況。

模板引數有兩種:一種是型別引數,一種是非型別引數。

另外,模板引數也可以去模板,具體見p226

隱士例項化,只有函式模板可以。類模板的使用必須用顯示例項。

第一種是發生呼叫的時候,實參並沒有顯示指定。 

第二種是在發生呼叫的時候,講實參顯示化 

第三種是沒有發生呼叫的時候,通過宣告將模板函式或者模板類例項化。

所有的模板的例項化,都要提供模板類或者模板函式的完整定義。所有一般把他的定義(而不是宣告)放到hpp檔案中。

然後單獨找個檔案,把所有想要用到的提前顯示例項化。

用得少,忽略

下面的例子,非常符合以往c++的程式設計風格,但是就是編譯不通過。我們前面提到過模板函式例項化,要有兩個條件:

1 - 發生了函式呼叫或者顯示例項或者實參例項。

2 - 同乙份**中,必須要有模板的定義。但是在本例main.cpp中呼叫func(3);本來應該可以隱士例項化,但是main.cpp裡面包含的是func.h這個裡面只有宣告沒有定義。所以編譯不通過。

解決辦法:

1 - 將模板定義放到hpp裡面。

2 - 再構造乙個cpp或者在模板定義的cpp裡面,把所有想要用到的型別都顯示例項化。

模板前面說了只要邏輯一樣,輸入引數不一樣,就可以寫成一樣的模板。但是有的大部分一樣,但是還是有個別型別需要單獨處理,這時候就用到了模板特化。

這個其實就是單獨處理每一位的乙個操作模板類。

其實就是類過載了 operator()函式

6.12 什麼是adl

第六章 高階I O函式

1 write 函式定義 ssize t write int fd,const void buf,size t count 函式說明 write 會把引數buf所指的記憶體寫入count個位元組到引數放到所指的檔案內。返回值 如果順利write 會返回實際寫入的位元組數。當有錯誤發生時則返回 1,錯...

c 第六章 模板

1 函式模板 template t add t a,t b return a b 隱式呼叫 add 5,6 顯示呼叫 add 5,6 模板之間可以構成過載,模板與普通函式之間也可構成過載,呼叫順序如下 跟某一普通的引數完全匹配,呼叫之,跟函式模板的引數可以完全匹配 隱式呼叫 呼叫之,跟函式模按引數不...

PAT 第六章 C 標準模板庫

for auto it vt.begin it vt.end it if st.find 7 st.end 1.輸入輸出 使用cin,cout輸入輸出 使用getline cin,strname 輸入,需要吸收換行符 string str int n cin n cin.ignore 使用getch...