童話故事 類模板與函式模板的例項化

2021-09-18 01:29:46 字數 2907 閱讀 7911

童話故事 --- 類模板與函式模板的例項化

摘要:函式模板的例項化,類模板的例項化,類模板和函式模板的例項化的比較

高飛狗:

hi,黛絲!好久不見,最近可好?

黛絲:你就別提了,煩得要死!

高飛狗:

有什麼煩心事,跟我說說,看我能不幫你排憂解難?

黛絲:歷經千辛萬苦,1個月內學習強國已經突破1000點大關。

高飛狗:

進步神速呀!

黛絲:跟自己比,進步神速;可是跟別人比,落後得更神速!你說奇怪不奇怪?

高飛狗:

真夠奇真夠怪的!

黛絲:高飛,你不會沒事閒得無聊專程來聽我訴苦的吧?

我知道你無事不登八寶殿,有什麼事你就直說。

高飛狗:

還是黛姐姐您最善解人意哪!

我最近學習也變得非常刻苦,正在研究函式模板和類模板,什麼顯示explicit例項化,什麼隱式implicit例項化,越學越暈,您能給講解講解嗎?

黛絲:你什麼時候也變得勤奮好學起來了?

看你態度這麼真誠,我就把我知道的都抖落給你吧。

黛絲:先說函式模板的例項化。

函式模板例項化的方法有兩種:隱式例項化和顯式(明確)例項化。

隱式例項化:應用程式呼叫了乙個既未宣告又未定義的函式。編譯器就到函式模板庫中查詢同名函式模板,根據被呼叫函式的入口引數和返回值,確定相匹配的函式模板,並生成乙個函式例項。隱式的意思就是應用程式未明確宣告或定義函式例項。

顯式(明確)例項化:應用程式明確宣告並定義了乙個函式模板的例項,如下表所示。

// 定義乙個函式模板,返回兩個數的小者

template

t min(const t & a, const t & b)

顯式(明確)例項化

template int min (const int & a, const int & b);

編譯器遇到顯式(明確)例項化語句,立即產生乙個相應的函式例項

函式模板顯式(明確)例項化的寫法

正確寫法

尖括號部分是關鍵,c++ primer v6書中的如下寫法是正確的:

template int min (const int & a, const int & b);

錯誤寫法

c++ primer v5書中的如下寫法是錯誤的:

template int min (const int & a, const int & b);

函式模板顯式(明確)例項化後的呼叫方法

正確寫法

尖括號部分是關鍵:

int c = min (a, b);

錯誤寫法

沒有尖括號部分是錯誤的

int c = min (a, b);

取得顯式(明確)例項化函式的位址或指標

正確寫法

尖括號部分是關鍵,函式名稱就是函式位址。函式例項的名稱必須包括型別資訊

auto fp = min ; 或者auto fp = &min ;

錯誤寫法

沒有尖括號部分是錯誤的

auto fp = min; 或者auto fp = &min;

函式例項的定義和宣告

函式例項的定義和宣告方法

定義寫法

template int min (const int & a, const int & b);

宣告寫法

關鍵字extern 表示宣告而非定義

extern template int min (const int & a, const int & b);

編譯器見到函式例項的定義,就產生乙個函式例項。

編譯器見到函式例項的宣告,就知道了呼叫這個函式例項的方式,也知道這個函式已在其它地方被定義,不必產生再乙個函式例項。

再來說類模板的例項化。

類模板只有顯式(明確)例項化,無法隱式例項化。比較簡單,不再累述。

把類模板和函式模板的例項化做個對比,如下圖所示:

情形

編譯器行為

隱式例項化函式模板

一定將例項**鏈結進入可執行程式中,因為函式例項肯定被呼叫了。

顯式例項化函式模板,但未被應用程式呼叫

例項**不會被鏈結進入可執行程式中。因為未被呼叫,將其鏈結進入可執行程式中沒有用。

就如同我們定義了乙個普通函式,但未被任何其它函式呼叫,其**不會被鏈結進入可執行程式中。

顯式例項化函式模板,且被應用程式呼叫

一定將例項**鏈結進入可執行程式中

例項化類模板,但應用程式未定義相應的物件

例項**不會被鏈結進入可執行程式中。因為未定義相應的物件,將其鏈結進入可執行程式中沒有用。

就如同我們定義了乙個普通類,但未定義相應的物件,其**不會被鏈結進可執行程式中。

例項化類模板,且應用程式定義了相應的物件

一定將例項**鏈結進入可執行程式中

另外,要重點提醒的是,尤其是在mcu上開發c++應用的朋友要注意:若類的物件是區域性物件或全域性物件,其生命週期貫穿整個應用程式,且其建構函式在

main()

函式之前被呼叫執行,所以這些物件的建構函式不可做太多工作。

高飛:親愛的,你講得太清楚了,讀書效率太低下,讀你以分鐘勝讀十年書!

黛絲:好你個油嘴滑舌!你說要給我排憂解難的,折騰半天,誰給誰排除萬難了?

函式模板與類模板的簡單例項

模板分類 class 和 typename的意思是一樣一樣的 1 函式模板 template 型別名 函式名 引數1,2 類模板 include using namespace std templateclass list 函式模板 templatetype2 max type1 a,type2 b...

函式模板與類模板(模板類)

什麼是泛型程式設計?泛型程式設計 編寫與型別無關的通用 是 復用的一種手段。模板是泛型程式設計的基礎。模板分為函式模板和類模板 下面我們就來說說函式模板 函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的型別版本 格式 template 返回值型別 函式名 引數列表 templatet1 ...

模板 函式模板與類模板

模板 template 是乙個將資料型別引數化的工具。模板分為函式模板和類模板兩種。在定義模板的時候不說明某些函式引數或者資料成員的型別,而將它們的資料型別作為模板引數。在使用模板時根據實參的資料型別確定模板引數即資料型別,從而得到模板的乙個例項。函式模板 function template 函式模...