模板(template)
泛型編程,讓編譯器把我們不想干的事情給干了
類似于typedef,解決了typedef使用不方便地原因(雖然看似寫少了,其實只是編譯器做多了)
例如:
生成兩個棧,但是兩個棧存儲的類型不一樣,那就只能寫兩個class了
函數模板
編譯器根據你的需要,按照你的函數模板生成多幾份不同的函數
可以類比函數參數,只不過函數參數傳的是對象,函數模板傳的是類型
格式
規則:
- 必須要讓編譯器在推演函數模板的時候可以推演出來
- 模板不能聲明和定義分離
核心原因:兩階段編譯(Two-Phase Lookup)
模板解析階段
編譯器在遇到模板定義時,只會進行語法檢查(如括號匹配、關鍵詞正確性),但不會生成具體代碼。此時它不知道T
的實際類型。實例化階段
當代碼中實際使用模板(如MyTemplate<int>
)時,編譯器才根據具體類型int
生成真正的代碼(稱為“實例化”)。此時需要完整的模板定義。
- 模板和函數可以同時存在,如果說某種傳參兩種函數都可以走,調用的規則遵循:有現成先吃現成的------有現成的,但是不夠匹配,有模板就吃編譯器的-----如果有強制調用模板就選模板
函數模板實例化
隱式實例化:讓編譯器根據你的傳參自己去推演
顯示實例化:直接在函數名和參數列表中間加上類型
類模板
不能推演實例化了,只能指定
使用
特點
- 在沒有接觸模板的情況下,一般類的名字就是對象的類型,但是類模板之后,對象的類型要加上顯示實例化后的類,例如Stack<int> s1的類型是Stack<int>
- 如果要做聲明和定義分離,要給那個定義加上模板并且指定為顯示實例化的函數,因為Stack不認識T
- 聲明和定義分離最好不要分離到兩個文件,因為會特別挫,要到【C++】簡單學——模板進階講