C++筆記------模版

來源:互聯網
上載者:User

標籤:new   初始化   blog   分離   using   2.3   this   3.2   out   

模版-----是為了讓代碼更加通用,使代碼不受資料類型的影響。減少代碼冗餘。模版將資料類型當作一個參數進行傳遞。包括函數模版和類模板。

函數模版:

//定義一個比較大小的函數模版template<typename Type>  // 也可以寫成 template <class Type>Type Max(Type a,Type b){    return a > b ? a : b;}int main(){    cout << Max(1,2) << endl;    cout << Max(‘A‘, ‘a‘) << endl;    cout << Max(2.5,3.2) << endl;    return 0;}

  模版會根據傳遞的實參自動進行資料類型的推演,比如在Max(2.5,2.3)中,模版會根據2.5是double,2.3是double,模版會推匯出ype是double類型,產生一個模版函數,使用double類型的比較函數。所以模版雖然方便,但是效率不高。

  比如,調用函數Max(1,2)時,編譯器會先產生一個int類型的模版函數。然後再去調用具體的模版函數。

//模版函數
int Max(int a, int b){ return a > b ? a : b}

  當出現實參類型不一致時,普通函數正常運行,模版會出現錯誤,如:

/*
template<typename Type> //會產生二義性Type Max(Type a,Type b){ return a > b ? a : b;}
*/int Max(int a,int b) //會自動進行隱式轉換{ return a > b ? a : b; }int main(){ cout << Max(1,2.3) << endl;
cout << Max(1,(int)2.3) << endl; //將2.3強制轉換成int類型
cout << Max<int>(1,2.3) << endl; //指定調用int類型的模版函數}

  也可以重新編寫模版函數,如:

template<typename Type1, typename Type2>Type2 Max(Type1 a,Type2 b){    return a > b ? a : b;}

如果是類對象進行比較,需要重載比較子。模版只負責比較,不管如何進行比較。

class Test{    int num;public:    Test(int b):num(b){}    bool operator>(const Test & t)    {        if (this->num > t.num)            return true;        else             return false;    }};template<typename Type1>Type1 Max(Type1 a,Type1 b){    return a > b ? a : b;}int main(){    Test t1(10);    Test t2(9);    Max(t1,t2);  //不能使用cout輸出,因為沒有提供<<運算子函數}

類模板: 

  利用類模板簡單實現線性鏈表。

   int a = int(); //將a初始化為0;
  模版類成員函數都是模版函數,不允許將類定義和實現分離

#include <iostream>using namespace std;//聲明List類template<typename Type>class List; 
template<typename Type>class ListNode{private: Type data; ListNode<Type> *next;public: friend class List<Type>; //將List類成為ListNode類的友元類,才能訪問私人資料 ListNode():data(Type()),next(NULL){} //零初始化:根據不同類型進行初始化。如,int a = int() //a被初始化為0。 ListNode(Type d,ListNode<Type> *n = NULL):data(d),next(n){} ~ListNode(){}};template<typename Type>class List{private: ListNode<Type> *first; ListNode<Type> *last; size_t size;public: List(); ~List(); bool push_back(Type x); //尾部插入鏈表
//顯示列表函數 void Show_list() const //模版類的成員函數可以在類內部定義 { ListNode<Type> *p=first; while(p != NULL) { cout << p->data; p = p->next; } }};template<typename Type> //模版類的成員函數都是模版函數,所以必須寫template<typename Type>List<Type>::List() //限定是List<Type>::{ first = last = new ListNode<Type>; last->next = NULL; size=0;}template<typename Type>List<Type>::~List(){ ListNode<Type> *p=first; while(p != NULL) { first = p->next; delete p; //在建構函式中使用new,則在解構函式中使用delete size--; p=first; }}template<typename Type>bool List<Type>::push_back(Type x){ ListNode<Type> *s = new ListNode<Type>; if( s == NULL ) return false; s->data = x; s->next = NULL; last->next = s; last = s; return true;}int main(){ List<int> mylist; for(int i=1;i<10;i++) { mylist.push_back(i); } mylist.Show_list(); return 0;}

C++筆記------模版

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.