【C++】模版(初階)

目錄

一. 函數模版

1. 格式 原理

2. 函數模版的實例化

二. 類模板


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. 格式 原理

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

typename是用來定義模板參數關鍵字也可以使用class,不能使用struct

模板參數作用范圍:緊跟的 { }

template<typename T> // 模板參數 -- 類型
void Swap(T& left, T& right)
{T temp = left;left = right;right = temp;
}template<typename T1, typename T2>
T1 Func (const T1& x, const T2& y)
{cout << x << " " << y << endl;return x;
}

int main()
{int a = 0, b = 1;double c = 1.1, d = 2.2;Swap(a, b);Swap(c, d);// Date d1(1949, 10, 1), d2(2015, 7, 3);Func(1, 2);Func(1, 2.2);return 0;
}

調用的是模版實例化出的函數(模板就是將本來應該我們做的重復的事情交給了編譯器 )


C++庫里面有。不需要寫Swap,也不用寫模版。直接使用

int main()
{int a = 0, b = 1;double c = 1.1, d = 2.2;swap(a, b);swap(c, d);// Date d1(1949, 10, 1), d2(2015, 7, 3);return 0;
}

2. 函數模版的實例化

隱式實例化:讓編譯器根據實參 推演模板參數的實際類型
顯示實例化:在函數名后的<>中 指定模板參數的實際類型

template<typename T>
T Add(const T& left, const T& right)
{return left + right;
}template<typename T>
T* Alloc(int n)
{return new T[n];
}int main()
{ int a1 = 10, a2 = 20;double d1 = 10.1, d2 = 20.2;cout << Add(a1, a2) << endl;cout << Add(d1, d2) << endl;// cout << Add(a1, d1) << endl; 報錯:編譯器無法確定T的類型// 解決方案1:用戶自己強制轉換cout << Add(a1, (int)d1) << endl;cout << Add((double)a1, d1) << endl;// 解決方案2:顯示實例化cout << Add<int>(a1, d1) << endl;cout << Add<double>(a1, d1) << endl;// 有些函數無法自動推,只能顯示實例化double* p1 = Alloc<double>(10);return 0;
}

類型轉換會產生臨時變量(常性)。Add(a1, (int)d1) 這里不是把 d1 傳給 right,所以 Add 要加 const

二. 類模板

template<class T1, class T2, ..., class Tn>
class 類模板名
{
????????
// 類內成員定義
};

普通類,類名和類型是一樣
類模板,類名和類型不一樣
類名:Stack
類型:Stack<T>

構造函數不一定用T這個參數,所以類模板都無法通過推演實例化,類都是顯示實例化


template<class T>
class Stack
{
public:Stack(int capacity = 4){_a = new T[capacity];_capacity = capacity;_size = 0;}void Push(const T& Date){// CheckCapacity();_a[_size] = Date;_size++;}~Stack(){if (_a){free(_a);_a = nullptr;_capacity = 0;_size = 0;}}private:T* _a;int _capacity;int _size;
};int main()
{Stack<int> s1;    // intStack<double> s2; // doubleStack<char> s3;   // char// Stack<int, double>s4; 多個模板參數return 0;
}

類模板的聲明和定義分離是別致的

類模板的聲明和定義最好不要分離到 2個文件,會報錯(后面講)

template<class T>
class Stack
{
public:Stack(int capacity = 4);void Push(const T& Date);~Stack(){if (_a){free(_a);_a = nullptr;_capacity = 0;_size = 0;}}private:T* _a;int _capacity;int _size;
};template<class T>
Stack<T>::Stack(int capacity)
{_a = new T[capacity];_capacity = capacity;_size = 0;
}template<class T>
void Stack<T>::Push(const T& data)
{// CheckCapacity();_a[_size] = data;_size++;
}

本篇的分享就到這里了,感謝觀看,如果對你有幫助,別忘了點贊+收藏+關注
小編會以自己學習過程中遇到的問題為素材,持續為您推送文章

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

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

相關文章

InfluxDB 開發工具鏈:IDE 插件與調試技巧(二)

四、利用 IDE 插件提升開發效率 4.1 代碼編寫技巧 在使用安裝了 InfluxDB 插件的 IDE 進行代碼編寫時&#xff0c;我們可以充分利用插件提供的代碼導航和智能提示功能&#xff0c;來顯著提高編寫 InfluxDB 相關代碼的效率和準確性。 以一個涉及多個 Measurement 和復雜查詢條…

定制開發開源AI智能名片S2B2C商城小程序:場景體驗新維度與四重目標達成

摘要&#xff1a;本文聚焦于定制開發開源AI智能名片S2B2C商城小程序&#xff0c;探討其在場景體驗領域的應用與價值。通過深入分析場景體驗的最高境界——深體驗、強認知、高傳播、關系深化這四個目標&#xff0c;闡述該小程序如何憑借自身特性與功能&#xff0c;在商業場景中實…

開源 GIS 服務器搭建:GeoServer 在 Linux 系統上的部署教程

GeoServer 是一個開源的地理信息服務服務器&#xff0c;可以發布地圖、矢量數據和柵格數據。 1. 更新系統 sudo apt update && sudo apt upgrade -y2. 安裝 Java 11 GeoServer 需要 Java 運行環境&#xff0c;這里用 OpenJDK 11。 sudo apt install openjdk-11-jdk…

前端面試通關:Cesium+Three+React優化+TypeScript實戰+ECharts性能方案

前端面試題詳解與更多面試題 WebGLCesiumThree 1. 自我介紹 回答要點&#xff1a; 教育背景和工作經驗技術棧和專長領域參與過的重點項目個人優勢和學習能力職業規劃 示例&#xff1a; “我是一名有前端開發經驗的工程師&#xff0c;熟練掌握React、Vue等主流框架&#x…

集成電路學習:什么是Object Tracking目標跟蹤

Object Tracking:目標跟蹤 Object Tracking,即目標跟蹤,是計算機視覺領域的一個重要研究方向,它專注于在視頻幀序列中連續地監測和定位一個或多個目標對象的位置。以下是對目標跟蹤技術的詳細解析: 一、定義與目的 定義: 目標跟蹤是指在視頻序列中,通過特定的算法…

深入理解計算機系統

參考書籍 8-18 處理器體系結構不同于馮諾依曼與哈佛體系 壓棧與退棧與理解c等高級語言的工作原理息息相關&#xff0c;也是常用的攻擊手段 Buffer Overflow的主要技術基礎 day2 繼續讀前言之類的 本書前言 這本書&#xff0c;講述應用程序員如何能夠利用系統知識來編寫更好…

LLM 中 token 簡介與 bert 實操解讀

一、什么是 LLM&#xff1f; LLM&#xff0c;全稱為 Large Language Model&#xff08;大語言模型&#xff09;&#xff0c;是一種基于神經網絡&#xff08;主要是 Transformer 結構&#xff09;的大規模自然語言處理&#xff08;NLP&#xff09;模型。其核心能力在于理解、生成…

【運維心得】三步更換HP筆記本電腦外殼

目錄 準備工作 第一步&#xff1a;拆卸電池與后蓋 第二步&#xff1a;處理隱藏螺絲 第三步&#xff1a;斷開內部排線 總結一下 今天又碰到了兩臺HP的筆記本&#xff0c;一臺外殼完好&#xff0c;但是無法開機&#xff0c;判斷是主板問題。另外一臺外殼有損壞&#xff0c;但…

深入 Linux 網絡(一) -- 網卡隊列

文章目錄網卡網卡的核心功能網卡的關鍵技術單隊列網卡多隊列網卡查看網卡信息ifconfigethtool查看網卡隊列Linux 查看中斷綁定網卡中斷查詢查看中斷綁定的 cpu總結1. 默認情況&#xff08;單隊列網卡&#xff09;2. 多隊列網卡3. 如何查看和配置綁定關系&#xff1f;4. 性能優化…

HTTP 1.0, 2.0 和 3.0 有什么區別?

HTTP/1.0 就像是“一問一答”的電話&#xff0c;每次打電話&#xff08;請求&#xff09;都得先撥號&#xff08;建立連接&#xff09;&#xff0c;說完一句話&#xff08;發送數據&#xff09;就掛斷&#xff08;關閉連接&#xff09;&#xff0c;再打下一通電話。效率比較低。…

無畏契約手游上線!手機遠控模擬器暢玩、搶先注冊稀有ID!

終于來了&#xff01;《無畏契約》手游今天已經全平臺上線&#xff01;保留了端游經典的英雄技能與射擊體驗&#x1f3ae;&#xff3b;新服開啟&#xff0c;ID爭奪戰一觸即發&#xff3d;《無畏契約》手游備受FPS玩家期待&#xff0c;累計獲得超6000萬線上預約&#xff01;每次…

《WINDOWS 環境下32位匯編語言程序設計》第4章 第一個窗口程序

4.1 開始了解窗口4.1.1 窗口是什么窗口是什么&#xff1f;大家每天在使用Windows&#xff0c;屏幕上的一個個方塊就是一個個窗口&#xff01;那么&#xff0c;窗口為什么是這個樣子呢&#xff1f;窗口就是程序嗎&#xff1f;1.使用窗口的原因回想一下DOS時代的計算機屏幕&#…

Mybatis執行sql流程(二)之加載Mapper

Mybatis加載Mapper注冊方式注冊時機特點MapperScanBean定義階段注冊接口定義批量注冊&#xff0c;推薦方式Mapper (接口注解)同 MapperScan需每個接口單獨標注XML 配置 <mapper>MyBatis 初始化時傳統方式&#xff0c;不依賴 Spring 容器SqlSessionTemplate 直接獲取調用時…

基于 JSP+Mysql實現MVC房屋租賃系統

基于 MVC 的房屋租賃系統的設計與實現摘 要&#xff1a;房屋租賃管理系統與網絡相結合&#xff0c;給用戶提供更加周到和人性化的服務。網站模式為 MVC 模式&#xff0c;基于 MySQL 數據庫,采用 JSP&#xff0c;Session 繪畫跟蹤、JavaScript 等技術,實現了普通用戶可以瀏覽、查…

第六天~提取Arxml中CAN采樣點信息Creat_ECU--Standard

?? ARXML探秘:解碼CAN采樣點的精準藝術 在汽車電子的交響樂中,CAN采樣點(Sample Point) 如同指揮家揮棒的關鍵時刻——它決定了何時"聆聽"總線上的信號。這個看似微小的百分比數值,卻是保障整車通信可靠性的核心密碼。本文將帶您深入ARXML中的采樣點配置世界…

Windows Git安裝配置

進入git官網Git - Downloading Package 點擊下載&#xff08;可復制鏈接到迅雷&#xff09; 雙擊運行exe安裝包 選擇安裝目錄 下一步 選擇 Git 默認編輯器&#xff0c;下一步設置初始化新項目(倉庫)的主干名字 讓Git決定&#xff08;Let Git decide&#xff09;使用默認的…

面試經驗分享-某電影廠

java會嗎&#xff1f;不會。。。。。hdfs讀文件寫文件的流程 數據寫入 1-客戶端向NameNode發起請求 2-NameNode審核權限和剩余空間&#xff0c;滿足條件即允許寫入&#xff0c;并告知客戶端寫入的DataNode地址 3-客戶端向指定的DataNode發送數據包 4-被寫入數據的DataNode同時完…

數據清理后續

前篇&#xff1a;Python 項目里的數據清理工作&#xff08;數據清洗步驟應用&#xff09; 一&#xff0c;先接上文添加兩種數據填充的方法 1、線性回歸填充 def lr_train_fill(train_data,train_label):train_data_all pd.concat([train_data, train_label], axis1)train_d…

nuc設置腳本開機自啟動

在終端執行gnome-session-properties這個是帶有圖型化頁面的設置開機自啟動的軟件沒有這個軟件的可以直接下載sudo apt update sudo apt install gnome-startup-applications一般都有&#xff0c;ubunutu自帶的右邊有添加&#xff0c;名稱和注釋隨便寫&#xff0c;只需要把命令…

JavaScript 性能優化實戰大綱

JavaScript 性能優化實戰大綱 核心優化方向 減少主線程阻塞 避免長任務&#xff08;Long Tasks&#xff09;拆分計算密集型操作使用 Web Workers 處理后臺任務優先使用 requestIdleCallback 或 requestAnimationFrame 內存管理 避免內存泄漏&#xff08;如未清理的定時器、閉包…