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