c++模板學習筆記

模板

  • 函數模板
  • 類模板

函數模板

函數模板的格式為:

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

typename是定義模板參數的關鍵字,可以使用class來代替(不能使用struct)

函數模板本身并不是函數,在編譯階段,編譯器通過用戶傳參自動識別參數類型,從而推導出模板函數參數列表的類型,得到一個函數供用戶使用,這樣就可以通過用戶傳遞的參數類型的不同,得到一批僅僅只是類型不同的函數,相當于把重復做的事情交給了編譯器,從而提升了開發效率。
當編譯器對同一typename推到出不同類型時會出錯:

template<typename T>
void swap(T& num1,T& num2)
{T temp=num1;num1=num2;num2=temp;
}int main()
{int num1=1;float num2=2.0;swap(num1,num2);//T被推導出不同的類型,出錯
}

類似于上面的swap函數由編譯器自動推導typename的類型的稱為隱式實例化,還有一種實例化方式為顯式實例化:

函數名 <指定類型>(參數)

有些場景只能使用顯式實例化

template<typename T>
T* fun(int n)//所有參數已經是特定類型
{return (T*)malloc(n);
}int main()
{int n=100;int*p=fun<int>(n);//顯式實例化return 0
]

要注意在顯式實例化中<>里面的類型個數要與template的<>中的typename的個數相同,同時是自左向右依次匹配typename的類型。

模板參數匹配原則:
①一個非模板函數與一個同名的模板函數同時存在,且該模板函數可以實例化出這個非模板函數時,優先使用非模板函數。


int Sum(int num1, int num2)
{cout << "非模板函數" << endl;return 0}template<typename T1,typename T2>
int Sum(T1 num1, T2 num2)
{cout << "模板函數" << endl;return 0;
}
int main()
{int num1=1;int num2=2;Sum(num1, num2);//優先使用非模板函數Sum<int, int>(num1, num2);//使用模板函數return 0;
}

②當非模板函數參數類型不匹配,而模板可以實例化出一個參數更匹配的函數時,優先使用模板實例化函數

int Sum(int num1, int num2)
{cout << "非模板函數" << endl;return 0;
}template<typename T1,typename T2>
int Sum(T1 num1, T2 num2)
{cout << "模板函數" << num2<<endl;return 0;
}
int main()
{int num1=1;float num2=2.0;//浮點型Sum(num1, num2);//優先使用模板實例化函數return 0;
}

總的來說就是哪個參數更匹配就優先使用哪個,如果兩個參數都匹配就優先使用現成的(非模板函數)。

類模板

類模板的定義格式為:

template<class T1,class T2...>
class 模板類類名
{//類體
};//注意這里有分號

模板類的成員函數的聲明和定義分離時,形式如下:

template<class T>
class MyVector
{
public:viod fun1();//函數聲明
private://...
};//函數定義
template<class T>
void MyVector<T>::fun()//注意返回值類型的位置
{//...
}

模板類的實例化格式為:

模板類類名<數據類型> 類名

模板類的類名不是真正的類,而實例化才是真正的類

MyVector<int> s;
//實例化出一個類后,利用該類實例化出一個對象s

需要注意的是類模板不能將聲明和定義分離到兩個文件中。

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

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

相關文章

【數據結構 — 排序 — 選擇排序】

數據結構 — 排序 — 選擇排序 一.選擇排序1.基本思想2.直接選擇排序2.1算法講解2.2.代碼實現2.2.1.函數定義2.2.2.算法接口實現2.2.3.測試代碼實現2.2.4.測試展示 3.堆排序3.1.算法講解3.2.代碼實現3.2.1.函數定義3.2.2.算法接口實現3.2.3.測試代碼實現3.2.4.測試展示 一.選擇…

Docker創建mqtt容器mosquitto

#1.創建映射到主機的配置文件/bwss/agent/docker/mosquitto_public/config/mosquitto.conf 內容為&#xff1a; listener 51883 0.0.0.0 # 0.0.0.0 allow_anonymous false persistence false persistence_location /mosquitto/data password_file /mosquitto/config/passwd …

Java 8 新特性深度解析:探索 Lambda 表達式、Stream API 和函數式編程的革新之路

Java8 新特性 Java 8 的革新之路 自 1995 年首次發布以來&#xff0c;Java 已經成為世界上最廣泛使用的編程語言之一。隨著時間的推移&#xff0c;Java 經歷了多次版本更新&#xff0c;其中最具里程碑意義的便是 Java 8 的發布。這個版本引入了許多重大變革&#xff0c;包括 …

開發猿的平平淡淡周末---2023/12/10

天氣陰 溫度適宜17攝氏度 AM 昨晚竟然下小雨了&#xff0c;還好還好&#xff0c;昨天刷的兩個背包基本干了 一覺睡到日三竿&#xff0c;誰是神仙&#xff0c;我是神仙&#xff08;哈哈哈哈哈哈&#xff09; 刷會兒視頻 補充下起床的動力 洗漱&#xff0c;恰飯&#xff0c;肝…

電工--基本放大電路

電壓放大倍數、輸入電阻和輸出電阻是放大電路的三個主要性能指標 共發射極基本交流放大電路 晶體管&#xff1a;電流放大作用。能量較小的輸入信號通過晶體管的控制作用&#xff0c;去控制電源所共給的能量&#xff0c;以在輸出端獲得一個能量較大的信號 集電極電源電壓&#…

traj_dist 筆記:測量軌跡距離

python 筆記 &#xff1a;trajectory_distance包&#xff08;如何可以正確使用&#xff09;【debug篇】-CSDN博客 經過前面的debug后&#xff0c;在setup.py對應的位置&#xff0c;寫代碼&#xff08;直接在別處import traj_dist我還是出問題&#xff09; 1 新建軌跡 import…

電子學會C/C++編程等級考試2021年12月(五級)真題解析

C/C++等級考試(1~8級)全部真題?點這里 第1題:書架 John最近買了一個書架用來存放奶牛養殖書籍,但書架很快被存滿了,只剩最頂層有空余。 John共有N頭奶牛(1 ≤ N ≤ 20,000),每頭奶牛有自己的高度Hi(1 ≤ Hi ≤ 10,000),N頭奶牛的總高度為S。書架高度為B(1 ≤ B ≤ S &…

[LeetCode周賽復盤] 第 375 場周賽20231210

[LeetCode周賽復盤] 第 375 場周賽20231210 一、本周周賽總結100143. 統計已測試設備1. 題目描述2. 思路分析3. 代碼實現 100155. 雙模冪運算1. 題目描述2. 思路分析3. 代碼實現 100137. 統計最大元素出現至少 K 次的子數組1. 題目描述2. 思路分析3. 代碼實現 100136. 統計好分…

Java中多態的一些簡單理解

什么是多態 1.面向對象的三大特性&#xff1a;封裝、繼承、多態。從一定角度來看&#xff0c;封裝和繼承幾乎都是為多態而準備的。這是我們最后一個概念&#xff0c;也是最重要的知識點。 2.多態的定義&#xff1a;指允許不同類的對象對同一消息做出響應。即同一消息可以根據發…

Linux用戶和權限

一、認知root用戶 1.1 了解什么是root用戶&#xff08;超級管理員&#xff09; root用戶&#xff08;超級管理員&#xff09; 無論是Windows、MacOS、Linux均采用多用戶的管理模式進行權限管理。 在Linux系統中&#xff0c;擁有最大權限的賬戶名為&#xff1a;root&#x…

Java9及之后關于類加載器的新特性

為了保證兼容性&#xff0c;JDK9沒有從根本上改變三層類加載器的架構和雙親委派模型&#xff0c;但為了模塊化系統的順利運行&#xff0c;仍然發生了一些值得被注意的變動。 一、變動1 由于引入了模塊化概念&#xff0c;所以不同的類加載器回去加載屬于不同模塊的類 啟動類加…

Nginx負載均衡實戰

&#x1f3b5;負載均衡組件 ngx_http_upstream_module https://nginx.org/en/docs/http/ngx_http_upstream_module.html upstream模塊允許Nginx定義一組或多組節點服務器組&#xff0c;使用時可以通過多種方式去定義服務器組 樣例&#xff1a; upstream backend {server back…

從零開發短視頻電商 在AWS SageMaker已創建的模型列表中進行部署

1.導航到 SageMaker 控制臺。 2.在 SageMaker 控制臺的左側導航欄中&#xff0c;選擇 “模型” 選項。 3.在模型列表中&#xff0c;找到您要部署的模型。選擇該模型。 4.點擊 “創建端點” 選項或者點擊 “創建端點配置” 選項都可以進行部署。 選擇創建端點進去后還是會進行…

k8s中部署基于nfs的StorageClass

部署nfs服務 1.1 創建基礎鏡像(選做) 如果以docker的形式部署nfs server, 參考此步驟, 若否, 該步驟可忽略。 mkdir /data/nfs -p chmod 755 /data/nfs# NFS默認端口: 111、2049、20048 docker run -d \ --privileged \ --name nfs_server \ -p 111:111/tcp \ -p 111:111/ud…

[CTFshow 紅包挑戰] 刷題記錄

文章目錄 紅包挑戰7紅包挑戰8紅包挑戰9 紅包挑戰7 考點&#xff1a;xdebug拓展 源碼 <?php highlight_file(__FILE__); error_reporting(2);extract($_GET); ini_set($name,$value);system("ls ".filter($_GET[1])."" );function filter($cmd){$cmd s…

1832_org-mode的注釋處理

Grey # :OPTIONS ^:nil org-mode的注釋處理 關于這部分其實比較簡單&#xff0c;在我現在的使用訴求上來說要求不多。但是我覺得如果考慮以后把文學式編程作為一種開發的主要體驗的話&#xff0c;掌握這樣的操作很有必要。因為我可以控制部分信息的輸出。 自然&#xff0c;控…

LeetCode-數組-重疊、合并、覆蓋問題-中等難度

435. 無重疊區間 我認為區間類的題型&#xff0c;大多數考驗的是思維能力&#xff0c;以及編碼能力&#xff0c;該類題型本身并無什么算法可言&#xff0c;主要是思維邏輯&#xff0c;比如本題實際上你只需要能夠總結出重疊與不重疊的含義&#xff0c;再加上一點編碼技巧&#…

go-zero開發入門-API服務開發示例

接口定義 定義 API 接口文件 接口文件 add.api 的內容如下&#xff1a; syntax "v1"info (title: "API 接口文件示例"desc: "演示如何編寫 API 接口文件"author: "一見"date: "2023年12月07日"version: "…

Spring Boot 優雅地處理重復請求

前 言 對于一些用戶請求&#xff0c;在某些情況下是可能重復發送的&#xff0c;如果是查詢類操作并無大礙&#xff0c;但其中有些是涉及寫入操作的&#xff0c;一旦重復了&#xff0c;可能會導致很嚴重的后果&#xff0c;例如交易的接口如果重復請求可能會重復下單。 重復的場…

Verilog基礎:$random系統函數的使用

相關閱讀 Verilog基礎?編輯https://blog.csdn.net/weixin_45791458/category_12263729.html $random系統函數語法的BNF范式如下所示&#xff0c;有關BNF范式相關內容&#xff0c;可以瀏覽以往文章Verilog基礎&#xff1a;巴科斯范式(BNF)。 $random系統函數在每次調用時返回一…