網站首頁 編程語言 正文
一.泛型編程
泛型編程:不再是針對某種類型,能適應廣泛的類型,跟具體的類型無關的代碼
如何實現一個通用的交換函數呢?
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; }
使用函數重載雖然可以實現,但是有一下幾個不好的地方: 1. 重載的函數僅僅是類型不同,代碼復用率比較低,只要有新類型出現時,就需要用戶自己增 加對應的函數 2. 代碼的可維護性比較低,一個出錯可能所有的重載均出錯
因此我們需要告訴編譯器一個模子,讓編譯器根據不同的類型利用該模子來生成代碼
二.函數模板
模板分為:函數模板,類模板
1.函數模板概念
函數模板代表了一個函數家族,該函數模板與類型無關,在使用時被參數化,根據實參類型產生 函數的特定類型版本。
2.函數模板格式
template<typename T>
返回值類型 函數名(參數列表){}
說明:
1.template<class T> 和 template<typename T>在此暫時認為一樣,template<struct T>是 錯誤的 ,沒有這種寫法
2.T是type的縮寫,T不一定寫T,可以寫任意字母,比如X,t ……但是習慣寫為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);
調用的是同一個函數嗎?
答:不是同一個。底層匯編可以看出不是同一個,如果調試時發現走的是同一個函數,其實是編譯器的優化導致。
實際上以后swap函數都不用自己寫了,庫中有模板,直接用就行
3.函數模板的原理
在編譯器編譯階段 ,對于模板函數的使用, 編譯器需要根據傳入的實參類型來推演生成對應類型 的函數 以供調用。比如: 當用 double 類型使用函數模板時,編譯器通過對實參類型的推演,將 T 確定為 double 類型,然后產生一份專門處理 double 類型的代碼 ,對于字符類型也是如此。 模板的實例化:
三.類模板
類模板的定義格式
template < class T1 , class T2 , ..., class Tn >
class 類模板名
{
// 類內成員定義
};
舉例:調用 Stack<int> st1; 時,用int替換模板中的T。調用 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; }
原文鏈接:https://blog.csdn.net/zhang_si_hang/article/details/125323152
相關推薦
- 2022-07-03 python調用騰訊云實名認證接口辨別身份證真假_python
- 2022-08-05 linux安裝部署lua環境
- 2022-07-08 Python數據分析Pandas?Dataframe排序操作_python
- 2022-04-17 小程序 底部懸浮的輸入框聚焦的時候 鍵盤緊貼輸入框
- 2022-10-26 python的django寫頁面上傳文件及遇到的問題小結_python
- 2022-06-06 解決Unity無限滾動復用列表的問題_C#教程
- 2022-08-29 Python基礎語法之變量與數據類型詳解_python
- 2022-02-24 Android基礎之隱藏標題欄/設置為全屏/橫豎屏切換_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支