c 模板的一些知識點總結

2021-06-02 12:08:30 字數 1383 閱讀 4068

一.

1 可以為類模板的模板引數提供預設引數,函式模板卻不行。

2可以為類模板進行偏特化,而函式模板卻不行。

二.模板引數

1 型別(可以是內建型別或是使用者自定義型別)

2 無型別引數(整數,指標,某些靜態實體的引用 例:bitset)

3 其他模板

三.關於typename

若乙個模板**內部的某個型別被模板型別引數所限定,則必須使用關鍵字typename作為字首進行宣告(建構函式的初始化列表中除外)

原因:template

class x

typename t::id i;//如果無typename的話,將出錯

這個模板定義假定,處理的類t中必須擁有某種稱為id的巢狀型別,id也可以是乙個t的靜態資料成員或列舉型別等。然而編譯器預設這個標示符是乙個資料物件,而非型別,因此當用此模板引數的巢狀型別來宣告物件時,必須加typename進行宣告。

四.關於函式模板

對於函式模板,可以省略掉模板引數,編譯器會從函式的引數中推斷出它們的型別。不允許使用預設模板引數。

然如果有乙個函式模板,它的模板引數即作為引數型別又作為返回型別那麼一定要首先申明函式的返回引數型別,否則就不能神略掉函式引數表中的任何型別引數。如:

template r imolicit_cast(const p& p)

int main()

如果將第一行的模板引數r和p交換,則會編譯出錯,因為第乙個模板引數作為函式的引數型別。

五.模板類的宣告與定義

傳統的程式設計方法中,普通函式的宣告與定義相分離是一種比較好的設計,然在使用類模板技術時, 模板類的宣告與定義都放在.h檔案中程式會順利的執行。如果想在.h和.cpp中分開實現,則需採取幾種特別的處理技術來實現,否則會出現連線錯誤(類似error lnk2019: 無法解析的外部符號)。

1 c++ 模板類的宣告與定義分別放在 h 檔案 和 cpp檔案中 在使用時需要把 cpp檔案也飽含與當前檔案中 如: #include "檔名.cpp"。

2  在template前加關鍵字export(相當部分編譯器不支援)

3  在類模板實現的cpp檔案中例項化其他檔案中要用到的型別

原因:模板類有著編譯器多型的性質,是一種隱式介面,編譯器在編譯期間會根據不同的模板引數型別具現化類,如果將模板類的宣告和實現相分離(即分別置於.h檔案和.cpp檔案中時),編譯器會將.cpp編譯成obj檔案,當其他檔案使用到這個模板類時,如果不採取以上提供的幾種方法,編譯器只能具現化模板類的宣告,並不能具現化它的實現(其實現檔案已編譯成obj檔案),因此在鏈結的時候會出現鏈結錯誤。

一些知識點總結

mysql資料庫中varchar和char的區別 1 varchar的長度是可變的,char的長度不可變。2 儲存時,char型別的資料要比varchar型別的資料速度更快,因為其長度固定,方便儲存於查詢。3 從儲存空間的角度講,因為插入型別資料的長度固定,有時候需要用空格進行佔位,所以儲存資料時占...

C 的一些知識點

include using namespace std 內聯函式,交換兩個數的值 建議直接定義,不用先在開頭宣告再在後面定義 inline void swap int a,int b int main int p newint 分配1個int型的記憶體空間 delete p 釋放記憶體 int p ...

一些js知識點總結

1.函式宣告與函式表示式 解析器在像執行環境中載入資料時,會先讀取函式宣告,並使其在執行任何 之前都可以訪問,對於函式表示式,必須等到解析器執行到它所在的 行,才會真正被執行。例 alert sum 10,10 function sum n,m 以上 可以正常執行,因為解析器通過函式宣告提公升的過程...