【轉】C++模板詳解
模板是C++支援引數化多型的工具,使用模板可以使使用者為類或者函式宣告一種一般模式,使得類中的某些資料成員或者成員函式的引數、返回值取得任意型別。
模板是一種對型別進行引數化的工具;
通常有兩種形式:函式模板和類模板;
函式模板針對僅引數型別不同的函式;
類模板針對僅資料成員和成員函式型別不同的類。
使用模板的目的就是能夠讓程式設計師編寫與型別無關的程式碼。比如編寫了一個交換兩個整型int 型別的swap函式,這個函式就只能實現int 型,對double,字元這些型別無法實現,要實現這些型別的交換就要重新編寫另一個swap函式。使用模板的目的就是要讓這程式的實現與型別無關,比如一個swap模板函式,即可以實現int 型,又可以實現double型的交換。模板可以應用於函式和類。下面分別介紹。
—————————————————————————————————————————-
函式模板的格式:
template <class 形參名,class 形參名,......> 返回型別 函式名(引數列表)
{
函式體
}
其中template和class是關鍵字,class可以用typename 關鍵字代替,在這裡typename 和class沒區別,<>括號中的引數叫模板形參,模板形參和函式形參很相像,模板形參不能為空。一但聲明瞭模板函式就可以用模板函式的形參名宣告類中的成員變數和成員函式,即可以在該函式中使用內建型別的地方都可以使用模板形參名。模板形參需要呼叫該模板函式時提供的模板實參來初始化模板形參,一旦編譯器確定了實際的模板實參型別就稱他例項化了函式模板的一個例項。比如swap的模板函式形式為
template void swap(T& a, T& b){},
當呼叫這樣的模板函式時型別T就會被被呼叫時的型別所代替,比如swap(a,b)其中a和b是int 型,這時模板函式swap中的形參T就會被int 所代替,模板函式就變為swap(int &a, int &b)。而當swap(c,d)其中c和d是double型別時,模板函式會被替換為swap(double &a, double &b),這樣就實現了函式的實現與型別無關的程式碼。
注意:對於函式模板而言不存在 h(int,int) 這樣的呼叫,不能在函式呼叫的引數中指定模板形參的型別,對函式模板的呼叫應使用實參推演來進行,即只能進行 h(2,3) 這樣的呼叫,或者int a, b; h(a,b)。
類模板的格式為:
template class 形參名,class 形參名> class 類名
{ … };
類模板和函式模板都是以template開始後接模板形參列表組成,模板形參不能為空,一但聲明瞭類模板就可以用類模板的形參名宣告類中的成員變數和成員函式,即可以在類中使用內建型別的地方都可以使用模板形參名來宣告。比如
template class A{public: T a; T b; T hy(T c, T &d);};
在類A中聲明瞭兩個型別為T的成員變數a和b,還聲明瞭一個返回型別為T帶兩個引數型別為T的函式hy。
2、類模板物件的建立:比如一個模板類A,則使用類模板建立物件的方法為A m;在類A後面跟上一個<>尖括號並在裡面填上相應的型別,這樣的話類A中凡是用到模板形參的地方都會被int 所代替。當類模板有兩個模板形參時建立物件的方法為A