初識C++:模版

本篇博客主要講解C++模版的相關內容。?

目錄

1.泛型編程

?2.函數模板

2.1 函數模版概念

2.2 函數模版格式

2.3?函數模版的原理

?2.4 函數模版的實例化

? ?1.隱式實例化:讓編譯器根據實參推演模板參數的實際類型

2.?顯式實例化:在函數名后的<>中指定模板參數的實際類型

2.5?模板參數的匹配原則

3. 類模板

?4.小結


1.泛型編程

如何實現一個通用的交換函數?

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;
}
void Swap(char& left, char& right)
{char temp = left;left = right;right = temp;
}

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

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

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

那能否告訴編譯器一個模子,讓編譯器根據不同的類型利用該模子來生成代碼呢?

?

?如果在C++中,也能夠存在這樣一個模具,通過給這個模具中填充不同材料(類型),來獲得不同材料的鑄件(即生成具體類型的代碼),那將會節省許多頭發。巧的是前人早已將樹栽好,我們只 需在此乘涼。

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

?2.函數模板

2.1 函數模版概念

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

2.2 函數模版格式

template<typename T1,typename T2,......,typename Tn>

template返回值類型 函數名(參數列表){}

template<typename T>
void Swap( T& left, ?T& right)
{ T temp = left;left = right; right = temp;
}

注意:typename是用來定義模板參數關鍵字也可以使用class(切記:不能使用struct代替class)

2.3?函數模版的原理

函數模板是一個藍圖,它本身并不是函數,是編譯器用使用方式產生特定具體類型函數的模具。所以其實模板就是將本來應該我們做的重復的事情交給了編譯器

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

?2.4 函數模版的實例化

用不同類型的參數使用函數模板時,稱為函數模板的實例化。模板參數實例化分為:隱式實例化和顯式實例化。

? ?1.隱式實例化:讓編譯器根據實參推演模板參數的實際類型
template<class T>
T Add(const T& left, const T& right)
{return left + right;
}
int main()
{int a1 = 10, a2 = 20;double d1 = 10.0, d2 = 20.0;Add(a1, a2);Add(d1, d2);// Add(a1, d1);Add(a, (int)d);return 0;
}

詳解代碼Add(a1, d1); 該語句不能通過編譯,因為在編譯期間,當編譯器看到該實例化時,需要推演其實參類型,通過實參a1將T推演為int通過實參d1將T推演為double類型,但模板參數列表中只有 一個T,編譯器無法確定此處到底該將T確定為int 或者 double類型而報錯。

處理方式:1. 用戶自己來強制轉化? 2. 使用顯式實例化

2.?顯式實例化:在函數名后的<>中指定模板參數的實際類型
int main(void)
{int a = 10;double b = 20.0;// 顯式實例化Add<int>(a, b);return 0;
}

如果類型不匹配,編譯器會嘗試進行隱式類型轉換,如果無法轉換成功編譯器將會報錯。

2.5?模板參數的匹配原則

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

?// 專門處理int的加法函數int Add(int left, int right){return left + right;}// 通用加法函數template<class T>T Add(T left, T right){return left + right;}void Test(){Add(1, 2); ? ? ? // 與非模板函數匹配,編譯器不需要特化Add<int>(1, 2); ?// 調用編譯器特化的Add版本}

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

// 專門處理int的加法函數int Add(int left, int right){return left + right;
}// 通用加法函數template<class T1, class T2>T1 Add(T1 left, T2 right){return left + right;}void Test(){Add(1, 2); ? ? // 與非函數模板類型完全匹配,不需要函數模板實例化Add(1, 2.0); ? // 模板函數可以生成更加匹配的版本,編譯器根據實參生成更加匹配的
Add函數}

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

3. 類模板

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

// Stack是類名,Stack<int>才是類型
Stack<int> st1; ? ?// int
Stack<double> st2; // double

?4.小結

以上便是本篇博客的所有內容了,如果大家學到知識的話,還請給博主點點贊!!!

?

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

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

相關文章

人工智能100問?第27問:神經網絡與貝葉斯網絡的關系?

神經網絡與貝葉斯網絡是兩種互補的智能模型:神經網絡通過多層非線性變換從數據中學習復雜模式,擅長大規模特征提取和預測,而貝葉斯網絡基于概率推理建模變量間的條件依賴關系,擅長處理不確定性和因果推斷。兩者的融合(如貝葉斯神經網絡)結合了深度學習的表征能力與概率建…

【node.js】入門基礎

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;node.js 文章目錄 1. Node.js簡介1.1 Node.js的核心特點1.2 Node.js適用場景 2. 第一個Node.js程序2.1 創建并運行Hello World2.2 創建簡單的HTTP服務器 3. Node.js核心概念3.1 模塊系統3.1.1 創建和導出模塊3.1.2 導入和使用模…

百度飛槳PaddleOCR 3.0開源發布 OCR精度躍升13%

百度飛槳 PaddleOCR 3.0 開源發布 2025 年 5 月 20 日&#xff0c;百度飛槳團隊正式發布了 PaddleOCR 3.0 版本&#xff0c;并將其開源。這一新版本在文字識別精度、多語種支持、手寫體識別以及高精度文檔解析等方面取得了顯著進展&#xff0c;進一步提升了 PaddleOCR 在 OCR …

Android 14 Binderized HAL開發實戰指南(AIDL版)

Android 14 Binderized HAL開發實戰指南&#xff08;AIDL版&#xff09; 環境要求 Android 14源碼編譯環境AOSP android-14.0.0_r7分支Soong build系統Java 17 & NDK r25c 項目結構 hardware/interfaces/myservice/ ├── 1.0 │ ├── IMyHalService.aidl # AID…

第九天的嘗試

目錄 一、每日一言 二、練習題 三、效果展示 四、下次題目 五、總結 一、每日一言 創造美好的代價是努力&#xff0c;失望以及毅力&#xff0c;首先是痛苦&#xff0c;然后才是歡樂。 時間是快的&#xff0c;看怎么利用&#xff0c;安排好一切事情&#xff0c;才能從容面對…

交安安全員:交通工程安全領域的關鍵角色

在交通工程這個龐大而復雜的領域中&#xff0c;交安安全員扮演著舉足輕重的角色&#xff0c;他們是安全的捍衛者&#xff0c;是交通工程順利推進的重要保障。? 交安安全員&#xff0c;專門從事公路水運工程施工企業安全生產管理工作。他們的專業身份由交通運輸部門頒發的交安…

實驗-設計一個應用系統(計算機組成原理)

目錄 一. 實驗內容 二. 實驗步驟 &#xff08;1&#xff09;七段數碼管顯示模塊 &#xff08;2&#xff09;指令模塊 &#xff08;3&#xff09;控制模塊 &#xff08;4&#xff09;ALU模塊 &#xff08;5&#xff09;CPU模塊 三. 實現效果 四. 實驗環境 五. 實驗小結…

【博客系統】博客系統第四彈:令牌技術

令牌機制 為什么不能使用 Session 實現登錄功能&#xff1f; 傳統思路&#xff1a; 登錄頁面把用戶名密碼提交給服務器。服務器端驗證用戶名密碼是否正確&#xff0c;并返回校驗結果給前端。如果密碼正確&#xff0c;則在服務器端創建 Session。通過 Cookie 把 sessionId 返回…

【瑞數3代】藥監評審中心逆向分析 | 后綴MmEwMD參數

1.目標 目標網址&#xff1a;https://www.cde.org.cn/main/news/listpage/545cf855a50574699b46b26bcb165f32 import requestscookies {FSSBBIl1UgzbN7N80S: 8sYeMWaC_IHoNl8Ckfx2y9MLiueMCkPr2V3MIoZkrMPUfzMMaXKzAoxpNPvyw4lt,Path: /,FSSBBIl1UgzbN7N80T: 3js3ygV.St6BvO20…

【漫話機器學習系列】274.基尼指數(Gini Index)

決策樹中的基尼指數&#xff08;Gini Index&#xff09;詳解 —— 從公式理解到實際應用 在構建決策樹模型時&#xff0c;一個核心問題是&#xff1a;如何選擇最優的特征來進行節點劃分&#xff1f; 這就涉及到了“劃分準則”的問題。常見的準則有信息增益、信息增益率以及本文…

R語言學習--Day07--T分布與T檢驗

昨天我們介紹了R中用于對數據進行分類的聚類分析的方法&#xff0c;接下來我們來看T分布。 T分布 T分布適用于幫我們估計整組數據&#xff08;較小的數據量&#xff0c;一般小于30&#xff09;的真實值在哪一個區間&#xff0c;具體是計算置信區間&#xff08;一般為95%&#…

數據結構與算法-線性表-雙向鏈表(Double Linked List)

1 線性表 1.4 雙向鏈表&#xff08;Double Linked List&#xff09; 雙向鏈表的結點中有兩個指針域&#xff0c;一個指向直接后繼&#xff0c;另一個指向直接前驅&#xff0c;主要是為了解決前向查找的問題。 雙向鏈表結構&#xff1a; 書籍和視頻教程都只講解了插入和刪除的…

甘特圖實例 dhtmlxGantt.js

本文介紹了如何使用dhtmlxGantt庫創建一個基礎的甘特圖示例&#xff0c;并對其進行漢化和自定義配置。首先&#xff0c;通過引入dhtmlxgantt.css和dhtmlxgantt.js文件初始化甘特圖。接著&#xff0c;通過設置gantt.i18n.setLocale("cn")實現核心文本的漢化&#xff0…

C++23 新增扁平化關聯容器詳解

文章目錄 一、引言已有關聯容器回顧新容器的引入原因 二、std::flat_set定義與特性代碼示例適用場景 三、std::flat_multiset定義與特性代碼示例適用場景 四、std::flat_map定義與特性代碼示例適用場景 五、std::flat_multimap定義與特性代碼示例適用場景 六、與其他容器的比較…

使用zap,對web應用/API接口 做安全檢測

https://www.zaproxy.org/getting-started/ 檢測方法 docker pull ghcr.io/zaproxy/zaproxy:stable# 執行baseline測試 docker run -t ghcr.io/zaproxy/zaproxy:stable zap-baseline.py \ -t https://baseline.yeshen.org# 執行api測試 docker run -t ghcr.io/zaproxy/zaproxy…

Qt—模態與非模態對話框

Qt—模態與非模態對話框 核心概念 ?模態對話框??&#xff1a;強制用戶優先處理當前窗口&#xff0c;阻塞指定范圍的用戶交互。?非模態對話框??&#xff1a;允許用戶自由切換窗口&#xff0c;無交互限制。 一、模態對話框類型與行為 1. 應用級模態&#xff08;Applica…

Axure高保真CRM客戶關系管理系統原型

一套出色的CRM&#xff08;客戶關系管理&#xff09;系統&#xff0c;無疑是企業管理者掌控客戶動態、提升銷售業績的得力助手。今天&#xff0c;就為大家介紹一款精心打造的Axure高保真CRM客戶關系管理系統原型模板&#xff0c;助你輕松開啟高效客戶管理之旅。 這款CRM原型模…

【羊圈——狀壓 + DP / 記憶化搜索DP】

題目 一般DP代碼&#xff08;注意&#xff0c;這里只能向外推(起始狀態是f(1,0)&#xff0c;不能向內推&#xff08;不然會導致之前的羊圈被割裂&#xff09;&#xff09; #include <bits/stdc.h> using namespace std;const int MAX_N 210; const int MAX_M 16;int n…

講解Mysql InnoDB的MVCC

1. 定義 MVCC是多版本并發控制&#xff08;Multi - Version Concurrency Control&#xff09;的縮寫。它是InnoDB存儲引擎實現高并發控制的一種機制。在數據庫系統中&#xff0c;多個事務可能會同時對數據進行讀寫操作&#xff0c;而MVCC通過為數據行保存多個版本來解決并發事務…

ZeroMQ Sockets介紹及應用示例

1. 概念解釋 ZeroMQ Sockets提供了一種類標準套接字&#xff08;socket-like&#xff09;的 API&#xff0c;是消息導向的通信機制&#xff0c;基于 TCP/UDP 等傳輸層協議&#xff0c;但封裝了底層細節&#xff08;如連接管理、消息路由、緩沖區等&#xff09;&#xff0c;提供…