C++里的模板-創(chuàng)新互聯(lián)

1、泛型編程

成都創(chuàng)新互聯(lián)公司于2013年開(kāi)始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元林周做網(wǎng)站,已為上家服務(wù),為林周各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792

——即實(shí)現(xiàn)一個(gè)通用的標(biāo)準(zhǔn)容器庫(kù)。所謂通用的標(biāo)準(zhǔn)容器庫(kù),就是要做到:比如List類存放所有肯恩類型的對(duì)象這樣的事;泛型編程讓你編寫一個(gè)完全一般化并可重復(fù)使用的算法,其效率與針對(duì)某特定數(shù)據(jù)類型而設(shè)計(jì)的算法相同。泛型即是指具有在多種數(shù)據(jù)類型上皆可操作的意思,與模板有些類似。

——泛型編程的代表作品STL是一種高效、泛型、可交互操作的軟件組件。

2、怎樣編寫一個(gè)通用的加法??

   1》使用函數(shù)重載,針對(duì)每個(gè)所需相同行為的不同類型重新實(shí)現(xiàn)它。

   缺點(diǎn):1》只要有新類型出現(xiàn),就要重新添加對(duì)應(yīng)函數(shù)。

             2》除類型外,所有函數(shù)的函數(shù)體都相同,代碼的復(fù)用率不高。

             3》如果函數(shù)只是返回值類型不同,函數(shù)重載不能解決問(wèn)題。

             4》一個(gè)方法有問(wèn)題,所有的方法都有問(wèn)題,不好維護(hù)。

   2》使用公共基類,將通用代碼放在公共基類里面。

   缺點(diǎn):1》借助公共基類來(lái)編寫通用代碼,將失去類型檢查的優(yōu)點(diǎn)。

             2》對(duì)于以后實(shí)現(xiàn)的很多類,都必須繼承自某個(gè)特定的基類,代碼維護(hù)更加困難。

   3》使用特殊的預(yù)處理程序。

   缺點(diǎn):1》不是函數(shù),不進(jìn)行參數(shù)類型檢查,安全性不高。

   4》還可以使用泛型編程。

3、泛型編程:

   1》編寫與類型無(wú)關(guān)的邏輯代碼,是代碼復(fù)用的一種手段。模板是泛型編程的基礎(chǔ)。

   2》模板分為:函數(shù)模板、類模板

4、函數(shù)模板:

  1》函數(shù)模板代表了一個(gè)函數(shù)家族,在使用時(shí)被參數(shù)化,根據(jù)實(shí)參類型產(chǎn)生函數(shù)的特定類型。

  2》函數(shù)模板的格式:C++里的模板

C++里的模板

   注意:1>typename是用來(lái)定義模板參數(shù)關(guān)鍵字,也可以使用class(建議盡量使用typename)

             2>但是不能使用struct

   3》函數(shù)模板也可以定義成inline函數(shù)。(但是inline必須放在模板參數(shù)表之后,返回值之前,不能放在template之前)

C++里的模板

 4》模板是一個(gè)藍(lán)圖,它本身不是類或者函數(shù),編譯器用模板產(chǎn)生特定的類或者函數(shù)的特定類型版本,產(chǎn)生模板特定類型的過(guò)程稱為函數(shù)模板實(shí)例化。

5、實(shí)參推演:

   從函數(shù)實(shí)參確定模板形參類型和值的過(guò)程叫做模板實(shí)參推演。多個(gè)類型形參的實(shí)參必須完全匹配。

6、類型形參轉(zhuǎn)換:

   1》一般不會(huì)轉(zhuǎn)換實(shí)參來(lái)匹配已有的實(shí)例化,相反會(huì)產(chǎn)生新的實(shí)例。

   2》編譯器只會(huì)執(zhí)行兩種轉(zhuǎn)換:

         1>const轉(zhuǎn)換:接收const引用或者const指針的函數(shù)可以分別用非const對(duì)象的引用或者指針來(lái)調(diào)用

         2>數(shù)組或者函數(shù)到指針的轉(zhuǎn)換:如果模板形參不是引用類型,則對(duì)數(shù)組或者函數(shù)類型的實(shí)參應(yīng)該用常規(guī)指針轉(zhuǎn)換。數(shù)組實(shí)參將當(dāng)做指向其第一個(gè)元素的指針,函數(shù)實(shí)參當(dāng)做指向函數(shù)類型的指針。

7、模板參數(shù):

  1》函數(shù)模板有兩種類型的參數(shù):模板參數(shù)和調(diào)用參數(shù)。

  2》而模板參數(shù)又分為:類型形參和非類型形參

  3》模板形參名字只能在模板形參之后到模板聲明或定義的結(jié)尾之間使用,遵循名字屏蔽規(guī)則。

  4》模板形參的名字在同一模板形參列表中只能使用一次。

  5》所有模板形參前面必須加上class或者typename關(guān)鍵字修飾。

  6》注意在函數(shù)模板內(nèi)部不能指定缺省的模板實(shí)參。

8、非模板類型形參:

   非模板類型形參是在模板內(nèi)部定義的常量,在需要常量表達(dá)式的時(shí)候,可以使用非模板類型參數(shù)。

9、模板形參說(shuō)明:

   1》模板形參表使用<>括起來(lái)。

   2》和函數(shù)參數(shù)表一樣,跟多個(gè)參數(shù)時(shí)必須用逗號(hào)隔開(kāi),類型可以相同也可以不同。

   3》模板形參表不能為空。

   4》模板形參可以是類型形參,也可以是非類型形參。類型形參跟在class和typename之后。

   5》模板類型形參可作為類型說(shuō)明符用在模板中的任何地方,與內(nèi)置類型或自定義類型的使用方法完全相同,可用于指定函數(shù)形參類型、返回值、局部變量和強(qiáng)制類型轉(zhuǎn)換。

   6》模板參數(shù)表中,class和typename具有形同的含義,可以互相交換,使用typename更加直觀。但是關(guān)鍵字typename是作為C++標(biāo)準(zhǔn)加入到C++中,就得編譯器可能不支持。

9+、模板函數(shù)重載:

    注意:函數(shù)和所有的重載版本的聲明都應(yīng)該位域該函數(shù)被調(diào)用位置之前。

    說(shuō)明:

     1》一個(gè)非模板函數(shù)可以和一個(gè)同名的函數(shù)模板同時(shí)存在,而且該函數(shù)模板可以被實(shí)例化為這個(gè)非模板函數(shù)。

     2》對(duì)于非模板函數(shù)和同名函數(shù)模板,如果其他條件都相同,再調(diào)用時(shí)會(huì)優(yōu)先調(diào)用非模板函數(shù),而不會(huì)從該模板產(chǎn)生一個(gè)實(shí)例化。如果模板可以產(chǎn)生一個(gè)具有更好匹配的函數(shù),那么將選擇模板。

     3》顯示指定一個(gè)空的模板實(shí)參列表,該語(yǔ)法告訴編譯器只有姆安巴你才能匹配這個(gè)調(diào)用。而且所有的模板都應(yīng)該根據(jù)實(shí)參演繹出來(lái)。

     4》模板函數(shù)不允許自動(dòng)類型轉(zhuǎn)換,但普通函數(shù)可以進(jìn)行自動(dòng)類型轉(zhuǎn)換。

10、函數(shù)模板的特化:

      模板函數(shù)特化形式如下:

      1》關(guān)鍵字template后面接一對(duì)空的尖括號(hào)<>

      2》再接模板名和一對(duì)尖括號(hào),尖括號(hào)中指定這個(gè)特化定義的模板形參

      3》函數(shù)形參表

      4》函數(shù)體

    注意:在特化之前,這個(gè)函數(shù)模板必須已經(jīng)存在,并且兩者形參個(gè)數(shù)一樣。

template<typename T>
bool IsEqual(T left, T right)
{
                 return left == right;
}
template<>
bool IsEqual<const char*>( const char * pleft, const char * pright) //這里的<const char*>就相當(dāng)于代替了T
{
                 return pleft == pright;
}

11、模板參數(shù)——適配器:stack(使用模板實(shí)現(xiàn)?!筮M(jìn)先出)

template <typename T>

class SeqList

{

private :

     int _size ;

     int _capacity ;

     T* _data ;

};



// template <class T, template<class> class Container>
template <class T, template<class> class Container = SeqList> // 缺省參數(shù)
class Stack
{
public :
     void Push(const T& x );
     void Pop();
     const T& Top();
     bool Empty();
private :
     Container<T > _con;
};
void Test()
{
     Stack<int> s1;
     Stack<int , SeqList> s2;
}
模板的模板參數(shù)——實(shí)現(xiàn)隊(duì)列
template<typename T,template< typename T > class Containter> //再嵌套一個(gè)模板類型參數(shù),,這里的關(guān)鍵字一定是class————只有類模板參數(shù)才能指定缺省值
class Queue
{
public:
                Queue()
                {}
                 void PushBack(const T& d)
                {
                                _con.PushBack();
                }
                 void PopFront()
                {
                                _con.PopFront();
                }
private:
                 Containter<T > _con;
};

int main()
{
                 Queue<int ,SeqList> q;
                q.PushBack(1);
                q.PushBack(2);
                q.PopFront();
                 return 0;
}

12、非類型的模板參數(shù):

// 靜態(tài)順序表
//template<typename T, size_t MAX_SIZE>
template <typename T, size_t MAX_SIZE = 10> //帶缺省模板參數(shù)
class SeqList
{
public :
     SeqList();
private :
     T _array [MAX_SIZE];
     int _size ;
};

template <typename T, size_t MAX_SIZE>
SeqList <T, MAX_SIZE>::SeqList()
    : _size(0)
{}

void Test()
{
     SeqList<int> s1;
     SeqList<int , 20> s2;
}

13、模板類:

模板類也是模板,必須以關(guān)鍵字template開(kāi)頭,后接模板形參表。


14、模板類的實(shí)例化:

     1》只要有一種不同的類型,編譯器就會(huì)實(shí)例化出一個(gè)對(duì)應(yīng)的類。

     2》 SeqList<int > sl1    SeqList<double > sl2;當(dāng)定義上述兩種類型的順序表時(shí),編譯器會(huì)使用int和double分別代替模板形參,重新編寫SeqList類,最后創(chuàng)建名為SeqList<int>和SeqList<double>的類。

15、類模板的特化:分兩種——局部特化、全特化

注意:全特化后定義成員函數(shù),不再需要模板形參

    1》類型萃取

    2》POD類型萃取

16、模板的分離編譯:

C++里的模板

C++里的模板

——解決方法:

     1》在模板頭文件 xxx.h 里面顯示實(shí)例化->模板類的定義后面添加 template class SeqList<int >; 一般不推薦這種方法,一方面老編譯器可能不支持,另一方面實(shí)例化依賴調(diào)用者。(不推薦)

     2》將聲明和定義放到一個(gè)文件 "xxx.hpp" 里面,推薦使用這種方法。

17、模板總結(jié):

  ——優(yōu)點(diǎn):

              1》模板復(fù)用了代碼,節(jié)省資源,更快的迭×××發(fā),C++的標(biāo)準(zhǔn)模板庫(kù)(STL)因此而產(chǎn)生。

              2》增強(qiáng)了代碼的靈活性。

  ——缺點(diǎn):

              1》模板讓代碼變得凌亂復(fù)雜,不易維護(hù),編譯代碼時(shí)間變長(zhǎng)。

              2》 出現(xiàn)模板編譯錯(cuò)誤時(shí),錯(cuò)誤信息非常凌亂,不易定位錯(cuò)誤。

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開(kāi)啟,新人活動(dòng)云服務(wù)器買多久送多久。

網(wǎng)站欄目:C++里的模板-創(chuàng)新互聯(lián)
文章來(lái)源:http://muchs.cn/article12/cddjgc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、建站公司、品牌網(wǎng)站制作、軟件開(kāi)發(fā)、企業(yè)網(wǎng)站制作商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)