標籤: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++筆記------模版