一文認識并學會c++模板初階

文章目錄

  • 泛型編程:
    • 概念
  • 函數模板
    • 概念:
    • 🚩函數模板格式
    • 原理:
    • 🚩函數模板實例化
    • 與非模板函數共存
  • 類模板
    • 類模板實例化

泛型編程:

概念

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

如果我們想寫一個通用的交換代碼 ?

void Swap(int& a, int& b)
{int t = a;a = b;b = t;
}
void Swap(double& a, double& b)
{int t = a;a = b;b = t;
}
void Swap(char& a, char& b)
{int t = a;a = b;b = t;
}

我們需要寫各種類型代碼,由于函數重載這樣可以實現,但這也太麻煩了!!

如果有個模具,我們需要什么類型 加進去就能用多好,

在這里插入圖片描述

函數模板

概念:

函數模板代表了一個函數家族,該函數模板與類型無關,在需要時實參化,根據實參類型產生相應特殊函數,

🚩函數模板格式

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

所以交換函數實現:

template<typename T>
void Swap(T &a,T& b)
{T temp = a;a = b;b = t;
}

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

原理:

在編譯階段,編譯器會通過根據傳入的實參類型推演出正確的模板參數類型,然后編譯器生成一份正確的代碼
在這里插入圖片描述

🚩函數模板實例化

隱式實例化:讓編譯器自動識別:

#include <iostream>
using namespace std;
template<typename T>
void Swap(T &a,T& b)
{T temp=a;a = b;b = temp;cout << a << " " << b<<endl;
}
int main()
{int a1 = 10, a2 = 20;double b1 = 10.5, b2 = 20.5;Swap(a1, a2);Swap(b1, b2);return 0;
}

20 10
20.5 10.5

但是有個問題,如下

int a3 = 30;
double b3 = 30.5;
Swap(a3, b3);

報錯了,
因為就一個T,不知道是int還是double了,
1,我們可以強轉
2,顯性實例化

int a3 = 30;
double b3 = 30.5;
Swap((double)a3, b3);

出錯了,但沒辦法QAQ
強轉會產生臨時變量,引用不能接受,實例化也沒用,模板參數加const又不能交換QAQ,所以我們只能先換個函數繼續講QAQ

顯性實例化:在函數名后接<>,里面指定模板函數實際類型

#include <iostream>
using namespace std;
template<typename T>
void Add(const T& a,const T& b)
{cout << a + b << endl;
}
int main()
{int a4 = 40;double b4 = 40.5;Add((double)a4, b4);Add<int>(a4, b4);return 0;
}

80.5
80

與非模板函數共存

模板函數是可以和非模板函數共名的,編譯器會優先考慮非模板函數,

#include <iostream>
using namespace std;
template<typename T>
void Add(const T& a,const T& b)
{cout << a + b << endl;
}
void Add(int a, int b)
{cout << "sum=";cout << a + b << endl;
}int main()
{int a4 = 40;double b4 = 40.5;Add((double)a4, b4);Add<int>(a4, b4);Add(1, 2);Add(1,2.1);return 0;
}

80.5
80
sum=3
sum=3

后兩個用非模板,說明如果合適,編譯器優先非模板函數,處理不了就用模板函數,
注意:模板函數不能自動轉換,非模板函數能自動轉換類型

類模板

格式:

template<class T1,class T2,…,class T3>
class 類模板名 {
};

//實現一個動態順序表
template<class T>
class vector
{
public:vector(int capacity=0):_pDate(new T[capacity]),_size(0),_capacity(capacity){}T& operator [](size_t pos){if(pos<size)return _pDate[pos];}size_t size(){return _size;}~vector();//類中聲明,類外定義
private:T* _pDate;size_t _size;size_t _capacity;
};
template<class T>
vector<T>::~vector()
{if (_pDate)delete[] _pDate;_size = _capacity = 0;
}

如果在類外定義函數,需要加模板列表

類模板實例化

類模板實例化和函數模板實例化不同,需要在類模板名字后面加<>,里面存的是需要實例化的類型

int main()
{vector<int> s1;vector<double> s2;return 0;
}

類模板名字不是真正的類,實例化的結果才是真正的類,

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

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

相關文章

Python實現VTK-自學筆記(5):在三維世界里自由舞蹈——高級交互與動態可視化

深夜的臺燈在屏幕上投下溫暖的弧光,指尖敲擊鍵盤的節奏逐漸與窗外雨滴聲融為一體。這是我在VTK世界的第五次探險,此刻顯示器里旋轉的彩色分子模型仿佛在對我眨眼——它渴望被觸摸、被塑造、被賦予生命。今天,就讓我們用Python為這些沉默的數據注入靈魂,見證靜態可視化如何蛻…

智慧充電樁數字化管理平臺:環境監測與動態數據可視化技術有哪些作用?

隨著新能源汽車的普及&#xff0c;智慧充電樁作為基礎設施的重要組成部分&#xff0c;正逐步向數字化、智能化方向發展。環境監測與動態數據可視化技術的應用&#xff0c;為充電樁的高效管理和運維提供了全新解決方案。通過實時采集環境參數與運行數據&#xff0c;并結合可視化…

LVS +Keepalived高可用群集

目錄 一&#xff1a;Keepalived雙機熱備基礎知識 1.Keepalived 概述及安裝 1.1.Keepalived的熱備方式 1.2.Keepalived 的安裝與服務控制 &#xff08;1&#xff09;安裝Keepalived &#xff08;2&#xff09;控制Keepalived服務 2.使用Keepalived實現雙機熱備 2.1.主服務…

深入剖析Java類加載機制:雙親委派模型的突破與實戰應用

引言&#xff1a;一個詭異的NoClassDefFoundError 某金融系統在遷移到微服務架構后&#xff0c;突然出現了一個詭異問題&#xff1a;在調用核心交易模塊時&#xff0c;頻繁拋出NoClassDefFoundError&#xff0c;但類明明存在于classpath中。經過排查&#xff0c;發現是由于不同…

Go語言的context

Golang context 實現原理 本篇文章是基于小徐先生的文章的修改和個人注解&#xff0c;要查看原文可以點擊上述的鏈接查看 目前我這篇文章的go語言版本是1.24.1 context上下文 context被當作第一個參數&#xff08;官方建議&#xff09;&#xff0c;并且不斷的傳遞下去&…

BERT、GPT-3與超越:NLP模型演進全解析

自然語言處理&#xff08;NLP&#xff09;領域近年來經歷了前所未有的變革&#xff0c;從早期的統計方法到如今的深度學習大模型&#xff0c;技術的進步推動了機器理解、生成和交互能力的飛躍。其中&#xff0c;BERT和GPT-3作為兩個里程碑式的模型&#xff0c;分別代表了不同的…

Kanass入門教程- 事項管理

kanass是一款國產開源免費、簡潔易用的項目管理工具&#xff0c;包含項目管理、項目集管理、事項管理、版本管理、迭代管理、計劃管理等相關模塊。工具功能完善&#xff0c;用戶界面友好&#xff0c;操作流暢。本文主要介紹事項管理使用指南。 1、添加事項 事項有多種類型 分…

2025年5月個人工作生活總結

本文為 2025年5月工作生活總結。 研發編碼 一個項目的臨時記錄 月初和另一項目同事向業主匯報方案&#xff0c;兩個項目都不滿意&#xff0c;后來領導做了調整&#xff0c;將項目合并&#xff0c;拆分了好幾大塊。原來我做的一些工作&#xff0c;如數據庫、中間件等&#xff…

? Unity AVProVideo插件自帶播放器 腳本重構 實現視頻激活重置功能

一、功能概述 本筆記記錄直接修改插件自帶的場景播放其中 原始的 MediaPlayerUI 腳本,實現激活時自動重置播放器的功能。 我用的插件版本是 AVPro Video - Ultra Edition 2.7.3 修改后的腳本將具備以下特性: 激活 GameObject 時自動重置播放位置到開頭 可配置是否在重置后自…

5.31 數學復習筆記 22

前面的筆記&#xff0c;全部寫成一段&#xff0c;有點難以閱讀。現在改進一下排版。另外&#xff0c;寫筆記實際上就是圖一個放松呢&#xff0c;關鍵還是在于練習。 目前的計劃是&#xff0c;把講義上面的高數例題搞清楚之后&#xff0c;大量刷練習冊上面的題。感覺不做幾本練…

什么是 WPF 技術?什么是 WPF 樣式?下載、安裝、配置、基本語法簡介教程

什么是 WPF 技術&#xff1f;什么是 WPF 樣式&#xff1f;下載、安裝、配置、基本語法簡介教程 摘要 WPF教程、WPF開發、.NET 8 WPF、Visual Studio 2022 WPF、WPF下載、WPF安裝、WPF配置、WPF樣式、WPF樣式詳解、XAML語法、XAML基礎、MVVM架構、數據綁定、依賴屬性、資源字典…

ROS2與Unitree機器人集成指南

Tested systems and ROS2 distro systemsROS2 distroUbuntu 20.04foxyUbuntu 22.04humblesrc目錄上級才可以colcon build git clone https://github.com/unitreerobotics/unitree_ros2 Install Unitree ROS2 package 1. Dependencies sudo apt install ros-humble-rmw-cyclon…

深入探討集合與數組轉換方法

目錄 1、Arrays.asList() 1.1、方法作用 1.2、內部實現 1.3、修改元素的影響 1.4、注意事項 2、list.toArray() 2.1、方法作用 2.2、內部實現 2.3、修改元素的影響 2.4、特殊情況 1、對象引用 2、數組copy 3、對比總結 4、常見誤區與解決方案 5、實際應用建議…

深入理解交叉熵損失函數——全面推演各種形式

帶你從不一樣的視角綜合認識交叉熵損失&#xff0c;閱讀這篇文章&#xff0c;幫你建立其分類問題&#xff0c;對比學習&#xff0c;行人重識別&#xff0c;人臉識別等問題的聯系&#xff0c;閱讀這篇文章相信對你閱讀各種底層深度學習論文有幫助。 引言 1. 重新理解全連接層&…

STM32之FreeRTOS移植(重點)

RTOS的基本概念 實時操作系統&#xff08;Real Time Operating System&#xff09;的簡稱就叫做RTOS&#xff0c;是指具有實時性、能支持實時控制系統工作的操作系統&#xff0c;RTOS的首要任務就是調度所有可以利用的資源來完成實時控制任務的工作&#xff0c;其次才是提高工…

MySQL connection close 后, mysql server上的行為是什么

本文著重講述的是通過 msql client 連接到 mysql server &#xff0c;發起 update 、 select 操作(由于數據量非常大&#xff0c;所以 update、select 操作都很耗時&#xff0c;即在結果返回前我們有足夠的時間執行一些操作) 。 在客戶端分別嘗試執行 ctrl C 結束關閉 mysql c…

dvwa3——CSRF

LOW&#xff1a; 先嘗試change一組密碼&#xff1a;123456 修改成功&#xff0c;我們觀察上面的url代碼 http://localhost/DVWA/vulnerabilities/csrf/?password_new123456&password_conf123456&ChangeChange# 將password_new部分與password_conf部分改成我們想要的…

Linux 中常見的安全與權限機制

Linux 中常見的安全與權限機制主要包括以下幾類&#xff0c;從文件系統權限到系統級訪問控制&#xff0c;構建了多層次的安全保障體系。 &#x1f510; 一、文件權限與用戶管理 1. 基本權限&#xff08;rwx&#xff09; r&#xff08;read&#xff09;&#xff1a;讀取文件內…

CSS篇-3

1. CSS 中哪些樣式可以繼承&#xff1f;哪些不可以繼承&#xff1f; 可繼承的樣式&#xff1a; 與字體相關的樣式&#xff0c;如&#xff1a;font-size、font-family、color 列表樣式&#xff1a;list-style&#xff08;如 UL、OL 的 list-style-type&#xff09; 不可繼承…

計算機網絡物理層基礎練習

第二章 物理層 填空題 從通信雙方信息交互的方式來看&#xff0c;通信的三種基本方式為單工、半雙工和全雙工。其中&#xff0c;單工數據傳輸只支持數據在一個方向上傳輸&#xff0c;全雙工數據傳輸則允許數據同時在兩個方向上傳輸。最基本的帶通調制方法包括三種&#xff1a…