【C++】模版初階---函數模版、類模版

🌟個人主頁:第七序章??

🌈專欄系列:C++

目錄

??前言:

🌈1.泛型編程:

🌈2.函數模板

🍭2.1函數模板概念

🍭2.2函數模板格式

🍭2.3 函數模板的原理

🍭2.4 函數模板的實例化

🍭2.5 函數模版的匹配原則

🌈3. 類模板

🍭3.1 類模板的定義格式

🍭3.2 類模板的實例化

🌈4.關鍵問題

🍉問題 1:

🍉問題 2:

🍉問題 3:

🌻共勉:


??前言:

上一篇我們學習了C/C++的內存管理,今天我們來學習一下C++的函數模板和類模板。

🌈1.泛型編程:

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

🥝template 模版關鍵字
template< class T>
template< typename T>
🥝模版參數傳遞的是類型;函數參數傳遞的是對象值。
🥝模版的定義和聲明不支持分別在兩個文件里面【會出現鏈接錯誤,所有的鏈接錯誤都是符號表找不到】因為編譯器的模版T是無法確定的,無法生成符號表。
🥝模版是不支持聲明與定義分別放到.h和.cpp中,一般都是需要放到一個文件中。有些地方就會命名成.hpp【頭文件和定義實現內容合并到一起】但是并不是必須是.hpp,.h也是可以的。

🌈2.函數模板

🍭2.1函數模板概念

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

🍭2.2函數模板格式

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

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. 隱式實例化:讓編譯器根據實參推演模板參數的實際類型
  2. 顯式實例化:在函數名后的<>中指定模板參數的實際類型
int main(void)
{int a = 10;double b = 20.0;// 顯式實例化 Add<int>(a, b); return 0;
}

🍭2.5 函數模版的匹配原則

🥝1.一個非模板函數【專門的函數】可以和一個同名的函數模板同時存在,而且該函數模板還可以被實例化為這個非模板函數。
🥝2.對于非模板函數和同名函數模板,如果其他條件都相同,在調動時會優先調用非模板函數而不會從該模板產生出一個實例。如果模板可以產生一個具有更好匹配的函數, 那么將選擇模板。
🥝3.模板函數不允許自動類型轉換,但普通函數可以進行自動類型轉換

🌈3. 類模板

🍭3.1 類模板的定義格式

template<class T1, class T2, ..., class Tn> 
class 類模板名
{// 類內成員定義 
};
template<class T>
class Stack
{
public:Stack(size_t capacity = 4){_array = new T[capacity];_capacity = capacity;_size = 0;cout << "Stack(size_t capacity = 4)" << endl;}~Stack(){delete[] _array;_capacity = 0;_size = 0;}void push(const T& data);
private:T* _array;int _capacity;int _size;
};//聲明和定義分離的寫法 不建議分離到.h 和.cpp
template<class T>
void Stack<T>::push(const T& data)
{_array[_size++] = data;
}

🍭3.2 類模板的實例化

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

	// Vector類名,Vector<int>才是類型 Vector<int> s1;Vector<double> s2;
int main()
{Stack<int> st1; // 實例化為處理int類型的Stack類,st1是該類對象Stack<double> st2; // 實例化為處理double類型的Stack類,st2是該類對象return 0;
}

說明Stack是類模板名,Stack<int>Stack<double>才是具體的類類型。

    🌈4.關鍵問題

    🍉問題 1:

    函數模板的隱式實例化和顯式實例化有何區別?在什么情況下需要使用顯式實例化?

    ?答案:區別主要體現在模板參數確定方式和類型轉換處理上。隱式實例化由編譯器根據實參自動推演模板參數的實際類型,且編譯器一般不進行類型轉換;顯式實例化需在函數名后<>中手動指定模板參數類型,類型不匹配時編譯器會嘗試隱式類型轉換。當出現隱式實例化無法確定模板參數的情況(如 Add (int, double),模板僅一個參數 T),或需要明確指定模板參數類型以滿足特定需求時,需使用顯式實例化

    🍉問題 2:

    類模板與函數模板在實例化方面有哪些核心差異?

    ?答案:一是實例化觸發方式,函數模板可通過隱式(編譯器推演)或顯式(手動指定)實例化,類模板只能通過顯式實例化(需在類模板名后<>指定類型);二是名稱性質,函數模板實例化時,模板名可通過實參推演關聯具體類型,而類模板名本身不是真正的類,只有實例化后的結果(如 Stack<int>)才是具體的類類型

    🍉問題 3:

    當非模板函數與同名函數模板同時存在時,編譯器的調用匹配規則是什么?

    ?答案:有三條核心規則。第一,非模板函數與同名函數模板可共存,模板還能實例化為該非模板函數;第二,其他條件相同時,優先調用非模板函數,若模板能生成參數更匹配的函數版本(如非模板函數處理 int,模板可處理 int 與 double 組合),則選擇模板;第三,模板函數不允許自動類型轉換,而普通函數可以,這也會影響調用匹配結果(如實參類型不匹配時,普通函數可能通過自動轉換匹配,模板函數則報錯)

    🌻共勉:

    以上就是本篇博客的所有內容,如果你覺得這篇博客對你有幫助的話,可以點贊收藏關注支持一波~~🥝

    ?

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

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

    相關文章

    查找算法(Java)

    目錄 一.定義 二.分類 三.線性查找 原理&#xff1a; 思路分析 代碼實現 例題實踐 1.兩數之和 方法一&#xff1a;暴力窮舉法 思路分析 代碼實現 方法二&#xff1a;創建哈希表 思路分析 代碼實現 2.移動零 思路分析 代碼實現 四.二分查找 原理&#xff1a; …

    計算機網絡--四層模型,IP地址和MAC地址

    四層模型&#xff1a;分別是應用層&#xff0c;傳輸層&#xff0c;網絡層和鏈路層。應用層&#xff1a;提供了應用程序之間相互通信的接口&#xff0c;允許用戶訪問網絡服務。這一層定義了應用程序如何與底層網絡進行交互。例如HTTP協議。傳輸層&#xff1a;它處理數據的分段、…

    解析、創建Excel文件的開源庫OpenXLSX介紹

    OpenXLSX是一個C庫&#xff0c;用于讀取、寫入、創建和修改.xlsx格式的Microsoft Excel文件&#xff0c;源碼地址&#xff1a;https://github.com/troldal/OpenXLSX &#xff0c;License為BSD-3-Clause&#xff0c;可在Windows、Linux、MaCOS平臺上使用。最新發布版本為v0.3.2&…

    【C++】C++11 篇二

    【C】C11 篇二前言移動構造函數移動賦值運算符重載類成員變量初始化 &#xff08;缺省值出自C11強制生成默認函數的關鍵字default:禁止生成默認函數的關鍵字delete:繼承和多態中的final與override關鍵字&#xff08;出自C11可變參數模板遞歸函數方式展開參數包逗號表達式展開參…

    構建Python環境的幾種工具

    本文主要介紹如何構建Python環境來處理不同的工作。 1.常用的構建Python環境的工具 ①venv(內置模塊):Python 3.3 內置標準庫模塊&#xff0c;無需額外安裝。 ②virtualenv:venv的前身&#xff0c;功能更強大且支持舊版Python。 ③conda:來自 Anaconda 或 Miniconda。不僅能…

    c#項目編譯時外部依賴文件的同步問題

    很多場景因為資源文件太多或太大無法放到資源里面或者是依賴的dll文件&#xff0c;需要編譯時同步到bin\debug或bin\release下的&#xff0c;這里面要修改工程文件代碼實現。 比如&#xff0c;我把這個項目依賴的dll和附加文件放到ref_dll文件夾里面&#xff0c;希望編譯的時候…

    數學建模常用算法-模擬退火算法

    一、模擬退火算法模擬退火的靈感來源于物理中的 “退火過程”—— 將金屬加熱到高溫后&#xff0c;緩慢冷卻&#xff0c;金屬原子會在熱能作用下自由運動&#xff0c;逐漸形成能量最低的穩定結構。算法將這一過程抽象為數學模型&#xff1a;“溫度 T”&#xff1a;對應物理中的…

    架構很簡單:業務架構圖

    緣起業務架構是一個復雜的體系&#xff0c;如何更簡單的表達&#xff0c;并能使用起來呢&#xff1f;所謂&#xff1a;大道至簡。基于此&#xff0c;這篇文章就開始了。業務是一切架構的開始&#xff0c;如果沒有業務&#xff0c;架構又有什么作用呢&#xff1f;所以做架構首先…

    【前端埋點】純前端實現 A/B Test

    “純前端實現 A/B Test”&#xff0c;意思就是 沒有后端分流、也不依賴流量網關&#xff0c;那么只能靠前端邏輯來做“流量切分”。 &#x1f3af; 目標 80% 的用戶 → A 頁面20% 的用戶 → B 頁面且要保證 同一個用戶每次訪問結果一致&#xff08;否則用戶刷新頁面時 A/B 會跳…

    Day22_【機器學習—集成學習(3)—Boosting—Adaboost算法】

    Adaptive Boosting(自適應提升)是基于 Boosting思想實現的一種集成學習算法&#xff0c;核心思想是通過逐步提高那些被前一步分類錯誤的樣本的權重來訓練一個強分類器。一、Adaboost算法直線相當于一個弱學習器&#xff0c;正確的數據權重減小&#xff0c;錯誤的數據權重增加二…

    C#語言入門詳解(18)傳值、輸出、引用、數組、具名、可選參數、擴展方法

    C#語言入門詳解&#xff08;18&#xff09;傳值、輸出、引用、數組、具名、可選參數、擴展方法一、傳值參數1. 值類型2. 引用類型&#xff0c;并且創建對象3. 引用類型&#xff0c;不創建對象二、引用參數1. 值類型2. 引用類型&#xff0c;創建新對象3. 引用類型&#xff0c;不…

    模型部署:(二)安卓端部署Yolov5-v6.0目標檢測項目全流程記錄

    模型部署&#xff1a;&#xff08;二&#xff09;安卓端部署Yolov5-v6.0目標檢測項目全流程記錄1、下載NCNN項目2、下載基于安卓的yolov5項目3、修改相應的配置文件4、將項目打包成apk包5、部署自己訓練的yolov5模型6、相關資料下載&#xff1a;1、下載NCNN項目 # 鏈接地址 ht…

    圖形基礎算法:如何將點與帶曲線邊的多邊形位置關系算法做穩定

    簡介判斷點與多邊形位置關系算法是幾何算法中最基礎的算法之一&#xff0c;包括布爾運算在內的非常非常多的算法都會用到它。它的穩定是算法庫穩定的關鍵。下面我們從一個邊都是直線的多邊形開始了解射線法的原理。然后看看引入曲線后會帶來哪些問題&#xff0c;以及在實際應用…

    react的filber架構

    好問題 &#x1f44d; 你問的是 React Fiber 架構。這是 React 16 引入的核心機制&#xff0c;用來解決 React 在大規模更新時的性能問題。下面我給你從 背景 → Fiber 是什么 → 原理 → 優點 → 流程 來系統講。一、為什么需要 Fiber&#xff1f;在 React 15 及以前&#xff…

    Lucky STUN穿透結合群暉NAS實現docker下transmission監聽端口動態更新

    參考文章 LCUKY系列教程 一 「LUCKY STUN穿透」使用 cURL 自動修改 Transmission 的監聽端口 二 「LUCKY STUN穿透」使用 Webhook 自動修改 qbittorrent 的監聽端口 三 LUCKY STUN穿透在Windows上使用UPnP工具為BT客戶端自動添加內外端口號不同的映射規則 四「LUCKY STUN穿透」…

    如何在Ubuntu暢玩鳴潮等游戲

    本教程只包括Steam上的游戲。# 更新軟件源 sudo apt update # 安裝Steam sudo apt install steam首先&#xff0c;在Ubuntu的snap商店安裝Steam&#xff0c;啟動&#xff0c;登陸&#xff0c;下載游戲。到這里的操作都比較簡單&#xff0c;對于沒有反作弊的游戲&#xff0c;往往…

    機器學習09——聚類(聚類性能度量、K均值聚類、層次聚類)

    上一章&#xff1a;機器學習08——集成學習 下一章&#xff1a;機器學習10——降維與度量學習 機器學習實戰項目&#xff1a;【從 0 到 1 落地】機器學習實操項目目錄&#xff1a;覆蓋入門到進階&#xff0c;大學生就業 / 競賽必備 文章目錄一、聚類任務&#xff08;無監督學習…

    解決 Docker 構建中 Python 依賴沖突的完整指南

    問題背景 在基于 registry.cn-shenzhen.aliyuncs.com/all_dev/dev:invoice-base 鏡像構建 Docker 容器時,我們遇到了一個常見的 Python 依賴管理問題: ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/topics/dependency-resolution/#dealing-…

    光子計算芯片實戰:Lightmatter Passage互連架構性能評測

    點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 摘要 隨著人工智能計算需求呈指數級增長&#xff0c;傳統電子計算…

    基于樹莓派與Jetson Nano集群的實驗邊緣設備上視覺語言模型(VLMs)的性能評估與實踐探索

    概述 2018年&#xff0c;TensorFlow Lite團隊的Pete Warden曾提出&#xff1a;“機器學習的未來在于微型化”。如今&#xff0c;隨著人工智能向高性能視覺強大的視覺語言模型&#xff08;Vision-language models, VLMs&#xff09;發展&#xff0c;對高性能計算資源的需求急劇…