您好,登錄后才能下訂單哦!
這篇文章主要介紹“C++的模板如何使用”,在日常操作中,相信很多人在C++的模板如何使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++的模板如何使用”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
泛型編程:不再是針對某種類型,能適應(yīng)廣泛的類型,跟具體的類型無關(guān)的代碼
如何實現(xiàn)一個通用的交換函數(shù)呢?
void Swap(int& left, int& right) { int temp = left; left = right; right = temp; } void Swap(double& left, double& right) { double temp = left; left = right; right = temp; }
使用函數(shù)重載雖然可以實現(xiàn),但是有一下幾個不好的地方: 1. 重載的函數(shù)僅僅是類型不同,代碼復(fù)用率比較低,只要有新類型出現(xiàn)時,就需要用戶自己增 加對應(yīng)的函數(shù) 2. 代碼的可維護性比較低,一個出錯可能所有的重載均出錯
因此我們需要告訴編譯器一個模子,讓編譯器根據(jù)不同的類型利用該模子來生成代碼
模板分為:函數(shù)模板,類模板
函數(shù)模板代表了一個函數(shù)家族,該函數(shù)模板與類型無關(guān),在使用時被參數(shù)化,根據(jù)實參類型產(chǎn)生 函數(shù)的特定類型版本。
template<typename T>
返回值類型 函數(shù)名(參數(shù)列表){}
說明:
1.template<class T> 和 template<typename T>在此暫時認(rèn)為一樣,template<struct T>是 錯誤的 ,沒有這種寫法
2.T是type的縮寫,T不一定寫T,可以寫任意字母,比如X,t ……但是習(xí)慣寫為T
舉例:
template<typename T> //或template<class T> void Swap(T& left, T& right) { T tmp = left; left = right; right = tmp; } int main() { int a = 0, b = 1; double c = 2.2, d = 3.3; swap(a, b); swap(c, d); return 0; }
swap(a, b);
和swap(c, d);
調(diào)用的是同一個函數(shù)嗎?
答:不是同一個。底層匯編可以看出不是同一個,如果調(diào)試時發(fā)現(xiàn)走的是同一個函數(shù),其實是編譯器的優(yōu)化導(dǎo)致。
實際上以后swap函數(shù)都不用自己寫了,庫中有模板,直接用就行
在編譯器編譯階段 ,對于模板函數(shù)的使用, 編譯器需要根據(jù)傳入的實參類型來推演生成對應(yīng)類型 的函數(shù) 以供調(diào)用。比如: 當(dāng)用 double 類型使用函數(shù)模板時,編譯器通過對實參類型的推演,將 T 確定為 double 類型,然后產(chǎn)生一份專門處理 double 類型的代碼 ,對于字符類型也是如此。 模板的實例化:
類模板的定義格式
template < class T1 , class T2 , ..., class Tn >
class 類模板名
{
// 類內(nèi)成員定義
};
舉例:調(diào)用 Stack<int> st1; 時,用int替換模板中的T。調(diào)用 Stack<double> st1; 時,用double替換模板中的T
// 類模板 template<class T> class Stack { public: Stack(int capacity = 0) { _a = new T[capacity]; _capacity = capacity; _top = 0; } ~Stack() { cout << "~Stack()" << endl; delete[] _a; _capacity = 0; _top = 0; } void Push(const T& x) {} private: T* _a; int _top; int _capacity; }; int main() { Stack<int> st1; // int st1.Push(1); Stack<double> st2; // double st2.Push(2.2); return 0; }
到此,關(guān)于“C++的模板如何使用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。