真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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ù)模板的格式:C++里的模板

C++里的模板

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

             2>但是不能使用struct

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

C++里的模板

 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ù)一樣。

template
bool 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)棧——后進先出)

template 

class 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)隊列
template class 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)順序表
//template
template  //帶缺省模板參數(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 sl1    SeqList sl2;當定義上述兩種類型的順序表時,編譯器會使用int和double分別代替模板形參,重新編寫SeqList類,最后創(chuàng)建名為SeqList和SeqList的類。

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

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

    1》類型萃取

    2》POD類型萃取

16、模板的分離編譯:

C++里的模板

C++里的模板

——解決方法:

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

     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)已開啟,新人活動云服務器買多久送多久。


本文標題:C++里的模板-創(chuàng)新互聯(lián)
標題鏈接:http://weahome.cn/article/cddjgc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部