所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。
1)c++提供兩種模板機制:函式模板、類模板
2)類屬 —— 型別引數化,又稱引數模板
使得程式(演算法)可以從邏輯功能上抽象,把被處理的物件(資料)型別作為引數傳遞。
總結: 模板把函式或類要處理的資料型別引數化,表現為引數的多型性,稱為類屬。
模板用於表達邏輯結構相同,但具體資料元素型別不同的資料物件的通用行為。
template < 型別形式參數列 >
型別形式引數的形式為:
typename t1 , typename t2 , …… , typename tn
或 class t1 , class t2 , …… , class tn
函式模板呼叫
myswap(a, b); //顯示型別呼叫
myswap(a, b); //自動資料型別推導
編譯器根據具體引數型別生成不同的模板函式。
template
void sortarray(t *a, t2 num) {}
函式模板和普通函式區別結論:
函式模板不允許自動型別轉化
普通函式能夠進行自動型別轉換
函式模板和普通函式在一起,呼叫規則:
1 函式模板可以像普通函式一樣被過載
2 c++編譯器優先考慮普通函式
3 如果函式模板可以產生乙個更好的匹配,那麼選擇模板
4 可以通過空模板實參列表的語法<>限定編譯器只通過模板匹配
編譯器編譯原理
gcc主要特徵:
1)gcc是乙個可移植的編譯器,支援多種硬體平台
2)gcc不僅僅是個本地編譯器,它還能跨平台交叉編譯。
3)gcc有多種語言前端,用於解析不同的語言。
4)gcc是按模組化設計的,可以加入新語言和新cpu架構的支援
5)gcc是自由軟體
gcc編譯過程 :
預處理(pre-processing)
編譯(compiling)
彙編(assembling)
鏈結(linking)
結論:gcc編譯工具是乙個工具鏈。。。。
函式模板機制結論
編譯器並不是把函式模板處理成能夠處理任意類的函式
編譯器從函式模板通過具體型別產生不同的函式
編譯器會對函式模板進行兩次編譯:
在宣告的地方對模板**本身進行編譯;在呼叫的地方對引數替換後的**進行編譯。
類模板用於實現類所需資料的型別引數化
類模板在表示如陣列、表、圖等資料結構顯得特別重要,
這些資料結構的表示和演算法不受所包含的元素型別的影響
從類模板a派生普通類b
子類從模板類繼承的時候,需要讓編譯器知道 父類的資料型別具體是什麼
從類模板a派生類模板b
注意為函式的三要素(名稱 引數 返回值)加上
友元函式:用友元函式過載 << >>,宣告時要加上
friend ostream& operator<< (ostream &out, complex &c3) ;
結論:友元函式只用來進行 左移 右移操作符過載。
本質是:模板是兩次編譯生成的,第一次生成的函式頭和第二次生成的函式頭 不一樣
在main函式檔案中要包含.cpp檔案(#include 「demo.cpp」),不然找不到函式體
建議使用第一種(最好)or第三種
歸納以上的介紹,可以這樣宣告和使用類模板:(看看,主要多練習)(宣告 定義 呼叫)
先寫出乙個實際的類。由於其語義明確,含義清楚,一般不會出錯。
將此類中準備改變的型別名(如int要改變為float或char)改用乙個自己指定的虛擬型別名(如上例中的numtype)。
在類宣告前面加入一行,格式為:
template
用類模板定義物件時用以下形式:
類模板名《實際型別名》 物件名;
類模板名《實際型別名》 物件名(實參表列);
如:compare cmp;
compare cmp(3,7);
如果在類模板外定義成員函式,應寫成類模板形式:
template
關於類模板的幾點說明:
類模板的型別引數可以有乙個或多個,每個型別前面都必須加class,如:
template
class someclass
;在定義物件時分別代入實際的型別名,如:
someclassobj;
和使用類一樣,使用類模板時要注意其作用域,只能在其有效作用域內用它定義物件。
模板可以有層次,乙個類模板可以作為基類,派生出派生模板類。
從類模板例項化的每個模板類有自己的類模板資料成員,該模板類的所有物件共享乙個static資料成員
和非模板類的static資料成員一樣,模板類的static資料成員也應該在檔案範圍定義和初始化
每個模板類有自己的類模板的static資料成員副本
小結 模板是c++型別引數化的多型工具。c++提供函式模板和類模板。
模板定義以模板說明開始。類屬引數必須在模板定義中至少出現一次。
同乙個類屬引數可以用於多個模板。
類屬引數可用於函式的引數型別、返回型別和宣告函式中的變數。
模板由編譯器根據實際資料型別例項化,生成可執行**。例項化的函式模板稱為模板函式;例項化的類模板稱為模板類。
函式模板可以用多種方式過載。
類模板可以在類層次中使用 。
訓練題:陣列模板類(myvector)完成對int、char、teacher型別元素的管理
結論1: 如果把teacher放入到myvector陣列中,並且teacher類的屬性含有指標,就是出現深拷貝和淺拷貝的問題。
結論2:需要teacher封裝的函式有:
1) 重寫拷貝建構函式
2) 過載等號操作符
3) 過載左移操作符。
理論提高:所有容器提供的都是值(value)語意,而非引用(reference)語意。容器執行插入元素的操作時,內部實施拷貝動作。所以stl容器內儲存的元素必須能夠被拷貝(必須提供拷貝建構函式)。
類模板,模板類和函式模板,模板函式
單整數類 雙整數類 所以c艹跟其他強型別語言為我們提供了乙個所謂模版功能 變數型別 整數 類模板的重點是模板。表示的是乙個模板,專門用於產生類的模子。例子 1 template 2 class vector 3 使用這個vector模板就可以產生很多的class 類 vector vector ve...
函式模板 和類模板
還是例子說話。函式模板 templatemax const t a,const t b 這樣用 int int a 1,b 2 max a,b float float c 1.0f,d 2.0f max c,d double double e 1.0,f 2.0 max e,f 類模板 templa...
函式模板和類模板
1 函式模板 template 形參名,class 形參名,返回型別 函式名 引數列表 其中template和 class 是關鍵字,class 可以用typename 關見字代替,在這裡 typename 和class 沒區別,括號中的引數叫模板形參,模板形參和函式形參很相像,模板形參不能為空。一...