1、泛型編程
成都創(chuàng)新互聯(lián)公司于2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務公司,擁有項目成都網(wǎng)站建設、網(wǎng)站設計網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元林周做網(wǎng)站,已為上家服務,為林周各地企業(yè)和個人服務,聯(lián)系電話:13518219792——即實現(xiàn)一個通用的標準容器庫。所謂通用的標準容器庫,就是要做到:比如List類存放所有肯恩類型的對象這樣的事;泛型編程讓你編寫一個完全一般化并可重復使用的算法,其效率與針對某特定數(shù)據(jù)類型而設計的算法相同。泛型即是指具有在多種數(shù)據(jù)類型上皆可操作的意思,與模板有些類似。
——泛型編程的代表作品STL是一種高效、泛型、可交互操作的軟件組件。
2、怎樣編寫一個通用的加法??
1》使用函數(shù)重載,針對每個所需相同行為的不同類型重新實現(xiàn)它。
缺點:1》只要有新類型出現(xiàn),就要重新添加對應函數(shù)。
2》除類型外,所有函數(shù)的函數(shù)體都相同,代碼的復用率不高。
3》如果函數(shù)只是返回值類型不同,函數(shù)重載不能解決問題。
4》一個方法有問題,所有的方法都有問題,不好維護。
2》使用公共基類,將通用代碼放在公共基類里面。
缺點:1》借助公共基類來編寫通用代碼,將失去類型檢查的優(yōu)點。
2》對于以后實現(xiàn)的很多類,都必須繼承自某個特定的基類,代碼維護更加困難。
3》使用特殊的預處理程序。
缺點:1》不是函數(shù),不進行參數(shù)類型檢查,安全性不高。
4》還可以使用泛型編程。
3、泛型編程:
1》編寫與類型無關的邏輯代碼,是代碼復用的一種手段。模板是泛型編程的基礎。
2》模板分為:函數(shù)模板、類模板
4、函數(shù)模板:
1》函數(shù)模板代表了一個函數(shù)家族,在使用時被參數(shù)化,根據(jù)實參類型產(chǎn)生函數(shù)的特定類型。
2》函數(shù)模板的格式:
注意:1>typename是用來定義模板參數(shù)關鍵字,也可以使用class(建議盡量使用typename)
2>但是不能使用struct
3》函數(shù)模板也可以定義成inline函數(shù)。(但是inline必須放在模板參數(shù)表之后,返回值之前,不能放在template之前)
4》模板是一個藍圖,它本身不是類或者函數(shù),編譯器用模板產(chǎn)生特定的類或者函數(shù)的特定類型版本,產(chǎn)生模板特定類型的過程稱為函數(shù)模板實例化。
5、實參推演:
從函數(shù)實參確定模板形參類型和值的過程叫做模板實參推演。多個類型形參的實參必須完全匹配。
6、類型形參轉(zhuǎn)換:
1》一般不會轉(zhuǎn)換實參來匹配已有的實例化,相反會產(chǎn)生新的實例。
2》編譯器只會執(zhí)行兩種轉(zhuǎn)換:
1>const轉(zhuǎn)換:接收const引用或者const指針的函數(shù)可以分別用非const對象的引用或者指針來調(diào)用
2>數(shù)組或者函數(shù)到指針的轉(zhuǎn)換:如果模板形參不是引用類型,則對數(shù)組或者函數(shù)類型的實參應該用常規(guī)指針轉(zhuǎn)換。數(shù)組實參將當做指向其第一個元素的指針,函數(shù)實參當做指向函數(shù)類型的指針。
7、模板參數(shù):
1》函數(shù)模板有兩種類型的參數(shù):模板參數(shù)和調(diào)用參數(shù)。
2》而模板參數(shù)又分為:類型形參和非類型形參
3》模板形參名字只能在模板形參之后到模板聲明或定義的結(jié)尾之間使用,遵循名字屏蔽規(guī)則。
4》模板形參的名字在同一模板形參列表中只能使用一次。
5》所有模板形參前面必須加上class或者typename關鍵字修飾。
6》注意在函數(shù)模板內(nèi)部不能指定缺省的模板實參。
8、非模板類型形參:
非模板類型形參是在模板內(nèi)部定義的常量,在需要常量表達式的時候,可以使用非模板類型參數(shù)。
9、模板形參說明:
1》模板形參表使用<>括起來。
2》和函數(shù)參數(shù)表一樣,跟多個參數(shù)時必須用逗號隔開,類型可以相同也可以不同。
3》模板形參表不能為空。
4》模板形參可以是類型形參,也可以是非類型形參。類型形參跟在class和typename之后。
5》模板類型形參可作為類型說明符用在模板中的任何地方,與內(nèi)置類型或自定義類型的使用方法完全相同,可用于指定函數(shù)形參類型、返回值、局部變量和強制類型轉(zhuǎn)換。
6》模板參數(shù)表中,class和typename具有形同的含義,可以互相交換,使用typename更加直觀。但是關鍵字typename是作為C++標準加入到C++中,就得編譯器可能不支持。
9+、模板函數(shù)重載:
注意:函數(shù)和所有的重載版本的聲明都應該位域該函數(shù)被調(diào)用位置之前。
說明:
1》一個非模板函數(shù)可以和一個同名的函數(shù)模板同時存在,而且該函數(shù)模板可以被實例化為這個非模板函數(shù)。
2》對于非模板函數(shù)和同名函數(shù)模板,如果其他條件都相同,再調(diào)用時會優(yōu)先調(diào)用非模板函數(shù),而不會從該模板產(chǎn)生一個實例化。如果模板可以產(chǎn)生一個具有更好匹配的函數(shù),那么將選擇模板。
3》顯示指定一個空的模板實參列表,該語法告訴編譯器只有姆安巴你才能匹配這個調(diào)用。而且所有的模板都應該根據(jù)實參演繹出來。
4》模板函數(shù)不允許自動類型轉(zhuǎn)換,但普通函數(shù)可以進行自動類型轉(zhuǎn)換。
10、函數(shù)模板的特化:
模板函數(shù)特化形式如下:
1》關鍵字template后面接一對空的尖括號<>
2》再接模板名和一對尖括號,尖括號中指定這個特化定義的模板形參
3》函數(shù)形參表
4》函數(shù)體
注意:在特化之前,這個函數(shù)模板必須已經(jīng)存在,并且兩者形參個數(shù)一樣。
templatebool IsEqual(T left, T right) { return left == right; } template<> bool IsEqual ( const char * pleft, const char * pright) //這里的 就相當于代替了T { return pleft == pright; }
11、模板參數(shù)——適配器:stack(使用模板實現(xiàn)棧——后進先出)
templateclass SeqList { private : int _size ; int _capacity ; T* _data ; }; // template class Container> template class Container = SeqList> // 缺省參數(shù) class Stack { public : void Push(const T& x ); void Pop(); const T& Top(); bool Empty(); private : Container _con; }; void Test() { Stack s1; Stack s2; }
模板的模板參數(shù)——實現(xiàn)隊列 templateclass Containter> //再嵌套一個模板類型參數(shù),,這里的關鍵字一定是class————只有類模板參數(shù)才能指定缺省值 class Queue { public: Queue() {} void PushBack(const T& d) { _con.PushBack(); } void PopFront() { _con.PopFront(); } private: Containter _con; }; int main() { Queue q; q.PushBack(1); q.PushBack(2); q.PopFront(); return 0; }
12、非類型的模板參數(shù):
// 靜態(tài)順序表 //templatetemplate //帶缺省模板參數(shù) class SeqList { public : SeqList(); private : T _array [MAX_SIZE]; int _size ; }; template SeqList ::SeqList() : _size(0) {} void Test() { SeqList s1; SeqList s2; }
13、模板類:
模板類也是模板,必須以關鍵字template開頭,后接模板形參表。
14、模板類的實例化:
1》只要有一種不同的類型,編譯器就會實例化出一個對應的類。
2》 SeqList
15、類模板的特化:分兩種——局部特化、全特化
注意:全特化后定義成員函數(shù),不再需要模板形參
1》類型萃取
2》POD類型萃取
16、模板的分離編譯:
——解決方法:
1》在模板頭文件 xxx.h 里面顯示實例化->模板類的定義后面添加 template class SeqList
2》將聲明和定義放到一個文件 "xxx.hpp" 里面,推薦使用這種方法。
17、模板總結(jié):
——優(yōu)點:
1》模板復用了代碼,節(jié)省資源,更快的迭×××發(fā),C++的標準模板庫(STL)因此而產(chǎn)生。
2》增強了代碼的靈活性。
——缺點:
1》模板讓代碼變得凌亂復雜,不易維護,編譯代碼時間變長。
2》 出現(xiàn)模板編譯錯誤時,錯誤信息非常凌亂,不易定位錯誤。
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡助力業(yè)務部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準確進行流量調(diào)度,確保服務器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務器買多久送多久。