網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
一.泛型編程
泛型編程:不再是針對(duì)某種類(lèi)型,能適應(yīng)廣泛的類(lèi)型,跟具體的類(lèi)型無(wú)關(guān)的代碼
如何實(shí)現(xiàn)一個(gè)通用的交換函數(shù)呢?
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; }
使用函數(shù)重載雖然可以實(shí)現(xiàn),但是有一下幾個(gè)不好的地方: 1. 重載的函數(shù)僅僅是類(lèi)型不同,代碼復(fù)用率比較低,只要有新類(lèi)型出現(xiàn)時(shí),就需要用戶自己增 加對(duì)應(yīng)的函數(shù) 2. 代碼的可維護(hù)性比較低,一個(gè)出錯(cuò)可能所有的重載均出錯(cuò)
因此我們需要告訴編譯器一個(gè)模子,讓編譯器根據(jù)不同的類(lèi)型利用該模子來(lái)生成代碼
二.函數(shù)模板
模板分為:函數(shù)模板,類(lèi)模板
1.函數(shù)模板概念
函數(shù)模板代表了一個(gè)函數(shù)家族,該函數(shù)模板與類(lèi)型無(wú)關(guān),在使用時(shí)被參數(shù)化,根據(jù)實(shí)參類(lèi)型產(chǎn)生 函數(shù)的特定類(lèi)型版本。
2.函數(shù)模板格式
template<typename T>
返回值類(lèi)型 函數(shù)名(參數(shù)列表){}
說(shuō)明:
1.template<class T> 和 template<typename T>在此暫時(shí)認(rèn)為一樣,template<struct T>是 錯(cuò)誤的 ,沒(méi)有這種寫(xiě)法
2.T是type的縮寫(xiě),T不一定寫(xiě)T,可以寫(xiě)任意字母,比如X,t ……但是習(xí)慣寫(xiě)為T(mén)
舉例:
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);
調(diào)用的是同一個(gè)函數(shù)嗎?
答:不是同一個(gè)。底層匯編可以看出不是同一個(gè),如果調(diào)試時(shí)發(fā)現(xiàn)走的是同一個(gè)函數(shù),其實(shí)是編譯器的優(yōu)化導(dǎo)致。
實(shí)際上以后swap函數(shù)都不用自己寫(xiě)了,庫(kù)中有模板,直接用就行
3.函數(shù)模板的原理
在編譯器編譯階段 ,對(duì)于模板函數(shù)的使用, 編譯器需要根據(jù)傳入的實(shí)參類(lèi)型來(lái)推演生成對(duì)應(yīng)類(lèi)型 的函數(shù) 以供調(diào)用。比如: 當(dāng)用 double 類(lèi)型使用函數(shù)模板時(shí),編譯器通過(guò)對(duì)實(shí)參類(lèi)型的推演,將 T 確定為 double 類(lèi)型,然后產(chǎn)生一份專(zhuān)門(mén)處理 double 類(lèi)型的代碼 ,對(duì)于字符類(lèi)型也是如此。 模板的實(shí)例化:
三.類(lèi)模板
類(lèi)模板的定義格式
template < class T1 , class T2 , ..., class Tn >
class 類(lèi)模板名
{
// 類(lèi)內(nèi)成員定義
};
舉例:調(diào)用 Stack<int> st1; 時(shí),用int替換模板中的T。調(diào)用 Stack<double> st1; 時(shí),用double替換模板中的T
// 類(lèi)模板 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
相關(guān)推薦
- 2022-04-18 python字符串格式化(%格式符和format方式)_python
- 2022-02-26 輸入ip地址,輸入框超過(guò)三位直接跳到下一個(gè)
- 2022-08-03 goFrame的隊(duì)列g(shù)queue對(duì)比channel使用詳解_Golang
- 2023-04-24 Tensor?和?NumPy?相互轉(zhuǎn)換的實(shí)現(xiàn)_python
- 2023-03-04 Qt利用tablewidget模擬手指實(shí)現(xiàn)滑動(dòng)_C 語(yǔ)言
- 2023-03-29 nginx部署前端項(xiàng)目的超級(jí)詳細(xì)步驟記錄_nginx
- 2022-07-11 Sonatype Nexus搭建Maven私服
- 2022-06-11 嵌入式C語(yǔ)言二級(jí)指針在鏈表中的應(yīng)用_C 語(yǔ)言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支