對于模板這個(gè)東西,之前一直知道它的存在,但是也一直是模糊的狀態(tài),不清楚它到底是怎么個(gè)用法,看別人用的也是模模糊糊的.之前就聽聞c++的精髓里面必有的一個(gè)就是泛型編程,也就是說的這個(gè)模板,今天就初探它的奧妙.
模板是一種對類型進(jìn)行參數(shù)化的工具;
通常有兩種形式:函數(shù)模板和類模板;
函數(shù)模板針對僅參數(shù)類型不同的函數(shù);
類模板針對僅數(shù)據(jù)成員和成員函數(shù)類型不同的類。
使用模板的目的就是能夠讓程序員編寫與類型無關(guān)的代碼。比如編寫了一個(gè)交換兩個(gè)整型int 類型的swap函數(shù),這個(gè)函數(shù)就只能實(shí)現(xiàn)int 型,對double,字符這些類型無法實(shí)現(xiàn),要實(shí)現(xiàn)這些類型的交換就要重新編寫另一個(gè)swap函數(shù)。使用模板的目的就是要讓這程序的實(shí)現(xiàn)與類型無關(guān),比如一個(gè)swap模板函數(shù),即可以實(shí)現(xiàn)int 型,又可以實(shí)現(xiàn)double型的交換。模板可以應(yīng)用于函數(shù)和類。(引自http://www.survivalescaperooms.com/gw811/archive/2012/10/25/2738929.html)
從上面的介紹可以看出,用模板是可以將一些通用的函數(shù)或者類進(jìn)行再抽象,比如棧,隊(duì)列等的具體內(nèi)容用某個(gè)名字<(class 形參名>)代替,然后真正要用的時(shí)候再將具體內(nèi)容代入,從而得到正確的效果.這樣不僅可以避免很多的重復(fù)代碼,而且可以處理我們在編寫類的時(shí)候還不存在的類型.這也是泛型編程的精髓所在吧(我自認(rèn)為的).
不過,我此前一直不明白的是,用泛型來寫代碼,那如果用到的東西那個(gè)類沒有怎么辦?
比如我有個(gè)函數(shù)是這樣的
template<class T>
T sum(T a, T b)
{
returna+b;
}
那假如我傳入的是自定義類型,他沒有重載+號,那運(yùn)行到這里會怎么樣呢?
經(jīng)測試,是編譯都編不過的.會得到一個(gè)錯(cuò)誤(錯(cuò)誤 1 errorC2676: 二進(jìn)制“+”:“B”不定義該運(yùn)算符或到預(yù)定義運(yùn)算符可接收的類型的轉(zhuǎn)換,B是自定義的類).其實(shí)我的一個(gè)理解就是這個(gè)模板只是編譯階段去處理所有的調(diào)用這個(gè)模板類或者模板函數(shù)的地方,將其換成真正的類型去編譯,所以換了之后,如果需要有的函數(shù)不存在,則就會出現(xiàn)編譯錯(cuò)誤.
此外 模板不能跟之前寫普通類一樣,聲明放一個(gè).h文件 實(shí)現(xiàn)放.cpp文件.聲明和實(shí)現(xiàn)必須放在同一個(gè)文件里面才能正常工作
新聞熱點(diǎn)
疑難解答
圖片精選