童話故事 --- 類模板與函式模板的例項化
摘要:函式模板的例項化,類模板的例項化,類模板和函式模板的例項化的比較
高飛狗:
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 函式模...