學習筆記—C++—模板初階

目錄

模板初階

泛型編程

函數模板

模版概念

函數模版格式

模版的原理

函數模板的實例化

模版參數的匹配規則

類模板


模板初階

泛型編程

使用函數重載雖然可以實現,但是有一下幾個不好的地方:

1. 重載的函數僅僅是類型不同,代碼復用率比較低,只要有新類型出現時,就需要用戶自己增

加對應的函數。

2. 代碼的可維護性比較低,一個出錯可能所有的重載均出錯。

如果在C++中,也能夠存在這樣一個模具,通過給這個模具中填充不同材料(類型),來獲得不同

材料的鑄件(即生成具體類型的代碼),那將會節省許多頭發。巧的是前人早已將樹栽好,我們只

需在此乘涼。

泛型編程:編寫與類型無關的通用代碼,是代碼復用的一種手段。模板是泛型編程的基礎。

void Swap(int& left, int& right)
{int c = left;left = right;right = c;
}void Swap(double& left, double& right)
{double c = left;left = right;right = c;
}void Swap(char& left, char& right)
{char c = left;left = right;right = c;
}

函數模板

模版概念

函數模板代表了一個函數家族,該函數模板與類型無關,在使用時被參數化,根據實參類型產生函數的特定類型版本。

函數模版格式

template<typename T1, typename T2,…,typename Tn>返回值類型 函數名(參數列表){}

下面是一個交換函數的模版,可以對不同的類型進行一個交換的操作

template<typename T>
void Swap(T& left, T& right)//針對廣泛的類型
{T temp = left;left = right;right = temp;
}
int main()
{int x = 0, y = 1;double m = 1.1, n = 2.2;//通過模版就很方便了//調用的其實還是兩個函數Swap(x, y);Swap(m, n);return 0;
}
注意: typename 用來定義模板參數 關鍵字 也可以使用 class( 切記:不能使用 struct 代替
class)。

模版的原理

函數模板是一個藍圖,它本身并不是函數,是編譯器用使用方式產生特定具體類型函數的模具。

所以其實模板就是將本來應該我們做的重復的事情交給了編譯器。

在編譯器編譯階段,對于模板函數的使用,編譯器需要根據傳入的實參類型來推演生成對應類型的函數以供調用。比如:當用double類型使用函數模板時,編譯器通過對實參類型的推演,將T確定為double類型,然后產生一份專門處理double類型的代碼,對于字符類型也是如此。

函數模板的實例化

編譯器通過模版生成對應的函數叫做實例化操作

實例化分為兩種,一種叫做隱式實例化,一種叫做顯式實例化

如果我們傳的是兩個類型不一樣的數據的話是會報錯的,但是我們可以通過增加多個模版參數來進行不同類型數據的交換的

template<class T>
T Add(const T& left, const T& right)
{return left + right;
}template<class T>
T* Func(size_t n)
{return new T[n];
}int main()
{int a1 = 10, a2 = 20;double c1 = 10.1, c2 = 20.1;//自動推倒類型   隱式實例化Add(a1, a2);Add(c1, c2);cout << Add(a1, (int)c2) << endl;cout << Add(c1, (double)a2) << endl;//顯示實例化cout << Add<int>(a1, c2) << endl;cout << Add<double>(c1, a2) << endl;Func<int>(10);Func<double>(20);return 0;
}

模版參數的匹配規則

●?一個非模板函數可以和一個同名的函數模板同時存在,而且該函數模板還可以被實例化為這個非模板函數。

●?對于非模板函數和同名函數模板,如果其他條件都相同,在調動時會優先調用非模板函數而不會從該模板產生出一個實例。如果模板可以產生一個具有更好匹配的函數, 那么將選擇模板。

●?模板函數不允許自動類型轉換,但普通函數可以進行自動類型轉換。

int Add(int left, int right)
{return left + right;
}template<class T>
T Add(T left,T right)
{return (left + right)*5;
}template<class T1,class T2>
T1 Add(T1 left,T2 right)
{return(left+right)*10
}int main()
{cout << Add(1, 2) << endl;       //調用一cout << Add<int>(1, 2) << endl;  //調用二cout << Add(1.1, 2.2) << endl;   //不匹配一,直接調用二cout << Add(1, 2.2) << endl;     //調用三 return 0;
}

類模板

template<class T1, class T2, ..., class Tn>
class 類模板名
{// 類內成員定義
};
// 類模板
template<typename T>
class Stack
{
public:Stack(size_t capacity = 4){_array = new T[capacity];_capacity = capacity;_size = 0;}void Push(const T& data);private:T* _array;size_t _capacity;size_t _size;
};// 聲明和定義分離的寫法
template<class T>
void Stack<T>::Push(const T& data)
{// ..._array[_size++] = data;
}int main()
{// 實例化生成對應的類,這里是兩個不同的類型Stack<int> st1;		// intStack<double> st2;  // double// Stack是類名,Stack<int>才是類型Stack<char> st3;return 0;
}

模版不建議聲明和定義分離到兩個文件.h 和.cpp會出現鏈接錯誤。

只有在類里面我們才能使用這個T,出了這個類就不作數了。

類模板實例化與函數模板實例化不同,類模板實例化需要在類模板名字后跟<>,然后將實例化的類型放在<>中即可,類模板名字不是真正的類,而實例化的結果才是真正的類。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79172.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79172.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79172.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Docker 中多個容器之間的通信

在 Docker 中&#xff0c;多個容器之間的通信可以通過以下幾種主要方式實現&#xff0c;具體選擇取決于網絡需求、隔離性及管理復雜度&#xff1a; 一、自定義 Bridge 網絡&#xff08;推薦&#xff09; 通過創建自定義的 Docker 網絡&#xff0c;容器可以加入同一網絡并通過容…

Day1-初次接觸UFS

經過導師初次介紹&#xff0c;了解工作以芯片測試為主&#xff0c;需堅持學習&#xff0c;小白大致需3-6月入門。整體學習應分為3大塊&#xff0c;UFS協議占40%&#xff08;3-4h&#xff09;,C技能占40%&#xff08;3-4h&#xff09;,工具或業務占20%&#xff08;1-2h&#xff…

【LeetCode 熱題100】二叉樹構造題精講:前序 + 中序建樹 有序數組構造 BST(力扣105 / 108)(Go語言版)

&#x1f331; 二叉樹構造題精講&#xff1a;前序 中序建樹 & 有序數組構造 BST 本文圍繞二叉樹的兩類構造類題目展開解析&#xff1a; 從前序與中序遍歷序列構造二叉樹 將有序數組轉換為二叉搜索樹 我們將從「已知遍歷構造樹」和「平衡構造 BST」兩個角度&#xff0c;拆…

JMeter重要的是什么

重要特性 支持多種協議&#xff1a; JMeter支持對多種協議進行性能測試&#xff0c;包括HTTP、HTTPS、FTP、JDBC&#xff08;數據庫&#xff09;、LDAP、JMS、SOAP、REST等。這使得它能夠適應各種不同的測試場景。強大的負載模擬能力&#xff1a; JMeter能夠模擬大量的虛擬用戶…

一文讀懂WPF系列之MVVM

WPF MVVM 什么是MVVMWPF為何使用MVVM機制WPFMVVM 的實現手段 INotifyPropertyChanged?數據綁定的源端通知??原理 PropertyChanged事件雙向綁定的完整條件常見疑惑問題 什么是MVVM 翻譯全稱就是 model-view-viewmodel 3部分內容 以wpf的概念角度來解釋就是 數據庫數據源模型…

OCR API識別對比

OCR 識別DEMO OCR識別 demo 文檔由來 最開始想使用百度開源的 paddlepaddle大模型 研究了幾天&#xff0c;發現表格識別會跨行&#xff0c;手寫識別的也不很準確。最終還是得使用現成提供的api。。 文檔說明 三個體驗下來 騰訊的識別度比較高&#xff0c;不論是手寫還是識別表…

嵌入式MCU常用模塊

日后填坑。 無線通信模塊 2.4G 基本介紹 以NRF24L01為例。 NRF24L01是一款2.4GHz的無線收發模塊&#xff0c;支持SPI通信協議&#xff0c;具有低功耗、高數據速率&#xff08;250kbps-2Mbps&#xff09;和多設備通信能力。 它可以同時與最多6個其他模塊通信&#xff0c;適合…

記一次InternVL3- 2B 8B的部署測驗日志

測試效果&#xff1a; 問題和耗時如圖 5、資源占用 不釋放資源會一直漲顯存。總體還算滿意&#xff0c;我試了好多個圖理解大模型&#xff0c;就屬它牛一點 附圖一張 補充&#xff0c;測試InternVL3-2B的結果 1、模型下載魔搭社區 2、運行環境&#xff1a; 1、硬件 RTX 30…

Java版本對應關系表

Java版本對應關系表 以下Java主要版本&#xff08;Major Version&#xff09;與公開大版本號的對應關系 公開大版本名稱Major 版本號內部版本號格式示例&#xff08;java -version輸出&#xff09;Java 8 (1.8)52 (0x34)1.8.0_XXX1.8.0_301Java 953 (0x35)9.0.X9.0.4Java 105…

2025最新版flink2.0.0安裝教程(保姆級)

Flink支持多種安裝模式。 local&#xff08;本地&#xff09;——本地模式 standalone——獨立模式&#xff0c;Flink自帶集群&#xff0c;開發測試環境使用 standaloneHA—獨立集群高可用模式&#xff0c;Flink自帶集群&#xff0c;開發測試環境使用 yarn——計算資源統一…

android11 配置默認電池優化白名單

目錄 1.介紹 2.讀取配置文件 3.默認配置一個白名單列表 1.介紹 在 Android 11 中,DeviceIdleController 是負責控制設備進入 Doze 模式(閑置模式) 的核心系統服務,其內部方法 readConfigFileLocked() 負責從配置文件中讀取 Doze 模式的行為參數,包括 idle 階段的時間間…

java中的Future的設計模式 手寫一個簡易的Future

案例 例如&#xff1a;今天是小妹的生日&#xff0c;需要一個蛋糕有點儀式感&#xff0c;于是去蛋糕店預定&#xff0c;預定完之后&#xff0c;店老板說蛋糕做好了&#xff0c;到時電話通知你&#xff0c;不可能在這傻傻的等著吧&#xff0c;還有其他事情要做啊&#xff0c;于…

【Redis】Redis C++使用

一、Redis的自定義網絡協議 1.1 為什么可以編寫出一個自定義的Redis客戶端 為什么我們可以編寫出一個自定義的Redis客戶端&#xff1f;因為Redis公開了自己的自定義協議。而對于一些其他軟件的客戶端&#xff0c;我們無法編寫出一個自定義的Redis客戶端&#xff0c;因為他們沒…

【軟考系統架構設計師】軟件工程知識點

1、 軟件開發生命周期 軟件定義時期&#xff1a;包括可行性研究和詳細需求分析過程&#xff0c;任務是確定軟件開發工程必須完成的總目標&#xff0c;具體分為問題定義、可行性研究、需求分析等 軟件開發時期&#xff1a;軟件的設計與實現&#xff0c;分為概要設計、詳細設計、…

DeepSeek 與開源:肥沃土壤孕育 AI 碩果

當國產 AI DeepSeek 以其低成本推理和多模態能力在全球范圍內引起轟動時&#xff0c;人們驚嘆于中國技術的迅猛發展&#xff0c;卻很少有人深究這一成就背后的根基。答案其實早已寫在中國開源生態二十多年的發展歷程中。 從倪光南院士提出“以開源打破技術壟斷”的理念&#x…

職坐標:智慧城市未來發展的核心驅動力

內容概要 智慧城市的演進正以顛覆性創新重構人類生存空間&#xff0c;其發展脈絡由物聯網、人工智能與云計算三大技術支柱交織而成。這些技術不僅推動城市治理從經驗決策轉向數據驅動模式&#xff0c;更通過實時感知與智能分析&#xff0c;實現交通、能源等領域的精準調控。以…

vue復習46~90

1.小兔鮮 所有都折疊 ctrl k,ctrl0 所有都展開 ctrl k,ctrlj當前結構渲染5次 <BaseBrandItem v-for"item in 5" :key"item"><BaseBrandItem>2.scoped樣式沖突 結構&#xff1a;只能有一個根元素樣式&#xff1a;全局樣式(默認)&#xff1…

PHP 用 workman 即時通訊,做個簡版QQ

1. workman是什么 &#xff0c;一般應用在那些地方 workerman是一個高性能的PHP socket 服務器框架&#xff0c;workerman基于PHP多進程以及libevent事件輪詢庫&#xff0c;PHP開發者只要實現一兩個接口&#xff0c;便可以開發出自己的網絡應用&#xff0c;例如Rpc服務、聊天室…

【WORD】批量將doc轉為docx

具體步驟進行&#xff1a; 打開Word文檔&#xff0c;按下AltF11快捷鍵&#xff0c;打開VBA編輯器。在VBA編輯器中&#xff0c;左側的“項目資源管理器”窗口會顯示當前打開的Word文檔相關項目。找到您要添加代碼的文檔項目&#xff08;通常以文檔名稱命名&#xff09;&#xf…

【免費】【實測有用】5KPlayer Windows 電腦作為 MacBook 無線擴展屏

總結&#xff1a;使用 5KPlayer 將 Windows 電腦作為 MacBook 無線擴展屏 準備工作 設備要求&#xff1a; MacBook 和 Windows 電腦需連接到同一 Wi-Fi 網絡。【這里有雷&#xff1a;eduroam不會成功&#xff0c;家里的WIFI成功了&#xff0c;需要確認校園網是否可行。】確保…