C++中函數模版和普通函數的區別


函數模版和同名普通函數在同一個作用域中,會優先調用那個函數?

函數模型在進行調用的時候會進行嚴格的類型匹配,而普通函數在調用的時候,會進行函數參數類型轉換(前提是自動類型轉換)。

調用函數模版,本質是類型參數化,將要嚴格的按照類型進行匹配,不會進行自動類型轉換

調用普通函數,可以進行隱式的數據類型轉換(前提是可以進行自動類型轉換),這是普通函數和模版函數的本質區別。

函數模版可以像普通函數被重載

C++編譯器優先考慮普通函數:這是因為普通函數已經存在了,而模版函數還需要進一步的判斷

如果函數模版產生一個更好的匹配,那么優先選擇函數模版

可以通過空模版實參列表的語法限制編譯器只調用模版函數(也就是在參數名之后加上<>,隱含了自動類型推斷!)

C++編譯器是如何支持模版機制的。

編譯器相關知識:

編譯C語言用GCC,編譯C++用的是G++

對於源程序的預處理,宏定義進行宏展開

編譯器

匯編器

連接器

C++編譯器提供的模版機制,就是通過二次編譯,生成對應具體的函數,函數模版最終最終根據函數調用變成一個個函數,也就是和普通函數沒有差別,也可以和普通函數發生函數重載。

編譯器並不是把函數模板處理成能夠處理任意類的函數

編譯器從函數模板通過具體類型產生不同的函數

編譯器會對函數模板進行兩次編譯

第一次編譯在聲明的地方對模板代碼本身進行編譯;第二次編譯在調用的地方對參數替換后的代碼進行編譯。

模板類派生的時候要指定父類的類型,用於內存空間大小的分配。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM