1. 程式人生 > >C++ 模板技術和STL實戰開發(1)——模板機制剖析

C++ 模板技術和STL實戰開發(1)——模板機制剖析

模板

模板把函式或類要處理的資料型別引數化,表現為引數的多型性,成為類屬

個人思考:模板也是計算機的很重要的思想“抽象思想”的體現

模板解決的是邏輯結構相同,但具體資料元素型別不同的資料

 

引數化程式設計:

引數化程式設計有效地降低了開發成本,減少了出錯概率,這也是模板思想的起源

深入剖析:

問題1:第12行和第15行調的是同一個函式嗎?

函式模板與模板函式的辨析

   函式模板:就是定義的一個帶有引數型別的函式

   模板函式:

      編譯器會把第12行換成 myswap<int>(a,b) ,第15行換成 myswap<double>(c,d) ,而把這兩個就叫做模板函式

所以在這裡生成了不同的模板函式,第12行和第15行調的不是同一個函式

問題2:通過函式模板生成的模板函式會不會引起和函式過載的衝突?

解釋:函式模板不提供隱式型別轉換,因此不許嚴格遵循T的型別定義

所以型別嚴格匹配是模板函式呼叫的先決條件

當普通函式和函式模板都符合呼叫規則的時候,優先使用普通函式;

因為普通函式在編譯期間就生成了函式體

而模板函式需要在呼叫時,編譯器才會編譯

在這種衝突的情況下,可以顯式地呼叫模板函式

總結:

編譯器在處理函式模板的時候,能夠生成任意型別的函式

根據呼叫的時機產生不同的函式:編譯器會堆函式模板進行二次編譯,

這是引數化程式設計的基礎,也是成為編譯時多型的由來

在宣告的地方對模板本身進行編譯,在呼叫的時候對引數化以後的具體呼叫進行編譯

hpp檔案的由來(明日任務)

name mangling的編譯原理(明日任務)