目錄
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...