【C++基礎】初識模板——一起步入泛型編程的大門

引言

在 C++ 世界里,模板(Template)就像一把萬能鑰匙。它允許你編寫通用的代碼,讓編譯器在需要的時候為具體類型生成對應的函數或類。換句話說,模板是 C++ 泛型編程(Generic Programming) 的基石。

  • 如果說面向對象編程解決的是**“對象的多態**”,那么模板解決的就是“代碼的多態”。
  • 本篇文章我們將通過函數模板類模板來學習模板的基礎知識。

一、概念

模板即字面意思,可以理解為制作雪糕的這個模板,在模板中填充不同口味的原料(類型),就會得到多個不同口味,相同形狀(即具體類型的代碼)的雪糕

二、函數模板

定義格式:

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

template<……>要寫在定義函數的前面一行

  1. 實現一個加法函數int add(int a,int b),這個函數只能處理int類型的參數
  2. 如果要對doublefloat進行加法運算,
  3. 需要再實現一個相同結構不同類型double add(double a,double b)的函數

這樣的代碼太過冗余,寫一個加法函數的模板就可以解決;傳入不同類型,運算不同類型對象;

在這里插入圖片描述

1. 隱式實例化

和調用普通函數一樣,調用模板函數,模板函數根據傳入的參數類型推導模板類型
(??注意:當模板參數只有一個只能傳入同一種類型的參數,否則報錯)

代碼示例:

// 函數模板
template <class T>
T add(const T& a, const T& b)
{return a + b;
}
int main()
{//隱式實例化int a = 1, b = 2;cout << add(a, b) << endl;double c = 10.0, d = 20.0;cout << add(c, d) << endl;return 0;
}

2.顯示實例化

  • 調用模板函數時,在函數名后面加上<類型>,例如:add<int> (a,b);
  • <>內的參數個數根據template <>內的參數而定

代碼示例:

// 函數模板
template <class T>
T add(const T& a, const T& b)
{return a + b;
}int main()
{//顯示實例化int a = 1, b = 2;cout << add<int>(a, b) << endl;double c = 10.0, d = 20.0;cout << add<double>(c, d) << endl;//類型不匹配時,編譯器自動進行類型轉換,轉換失敗就報錯cout<<add<int>(a,c)<<endl;return 0;
}

3. 普通函數和模板函數的優先級

  1. 一個普通函數與模板函數實例化后的函數類型完全相同時編譯器優先調用普通函數
  2. 如果顯示實例化(add <int> (a,b)),則會調用模板函數
using namespace std;
// 函數模板
template <class T>
T add(const T& a, const T& b)
{return a + b;
}
int add(int a,int b)
{return a + b;
}
int main()
{int a = 1, b = 2;//情況一:調用int add(int a,int b)普通函數cout << add(a, b) << endl;//情況二:調用T add(const T& a, const T& b)模板函數cout << add<int>(a, b) << endl;double c = 10.0, d = 20.0;//情況三:調用T add(const T& a, const T& b)模板函數cout << add(c, d) << endl;return 0;
}

三、類模板

定義格式

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

實例化

  • 使用類模板進行實例化時,采用類名+<類型>的形式,且后面必須加上<>
  • 實例化的對象類型由類名+<類型>組成,例如:A<int> a1;中的A<int>是對象a1的類型,A只是類名

代碼示例:

// 類模板
template <class T>
class A
{
public:T add(const T& a, const T& b){return a + b;}
private:T a;T b;};int main()
{A<int> a1;A<double> a2;cout<<a1.add(1, 1)<<endl;cout<<a2.add(1.0, 1.0)<<endl;return 0;
}

四、總結

函數模板解決的是“寫一次函數,適配多種類型”,而類模板則把這種靈活性帶進了類的世界。二者加起來,就構成了 C++ 泛型編程的基本骨架。學會它們之后,你就能體會到——代碼不再是寫死的,而是可以像拼積木一樣復用與擴展


寫到這里,模板的基礎操作就講完了;如果本文對你有幫助,麻煩你 👍點贊 ?收藏 ??關注 吧~

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

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

相關文章

項目管理框架如何影響團隊協作

在項目執行過程中&#xff0c;項目管理框架不僅是一套工具和流程&#xff0c;更是團隊協作方式的基礎。不同的項目管理框架會深刻影響團隊溝通效率、任務分配、決策方式和整體協同效果。 傳統框架通常強調層級與計劃&#xff0c;帶來高度規范化的協作&#xff1b;敏捷框架則強調…

正向代理,反向代理,負載均衡還有nginx

這是一個非常核心且重要的后端/運維知識領域。我會用盡可能清晰易懂的方式&#xff0c;結合生動的比喻&#xff0c;為你詳細梳理這些概念。核心概念一覽我們先從一個宏觀的角度來理解它們之間的關系&#xff1a;代理&#xff08;Proxy&#xff09;&#xff1a; 一個中間人的角色…

WebSocket壓縮傳輸優化:機器視覺高清流在DCS中的低延遲方案

引言在現代工業自動化領域&#xff0c;分布式控制系統&#xff08;DCS&#xff09;正面臨著前所未有的數據挑戰。隨著機器視覺技術的廣泛應用&#xff0c;高清視頻流已成為監控產品質量、檢測設備異常和保障生產安全的重要手段。然而&#xff0c;將720P、1080P甚至4K分辨率的高…

《Linux常見命令》

ls 功能&#xff1a;列出目錄下的子目錄與文件&#xff0c;對于文件&#xff0c;還會列出文件名及其他信息。 語法&#xff1a;ls [選項] [目錄或文件] 1.常用選項及說明選項說明-a列出目錄下的所有文件&#xff0c;包括以 . 開頭的隱含文件-d將目錄象文件一樣顯示&#xff0c;…

Python數據分析:函數定義時的位置參數。

目錄1 代碼示例2 歡迎糾錯3 免費爬蟲4 論文寫作/Python 學習智能體1 代碼示例 直接上代碼。 def pargs1(a, b):"""先看確定數量的位置參數。最簡單的位置參數。a和b都叫而且只能叫“位置參數”。所謂確定數量&#xff0c;很明顯&#xff0c;是兩個就是兩個&…

《沒有架構圖?用 netstat、ss、tcpdump 還原服務連接與數據流向》

&#x1f4e2; 你是否遇到過這些問題&#xff1f; 接手一個老項目&#xff0c;只有服務器賬號&#xff0c;沒有架構圖&#xff1f;服務突然異常&#xff0c;但不知道它依賴哪些外部系統&#xff1f;想畫數據流向圖&#xff0c;卻找不到文檔&#xff1f; 別擔心&#xff01;只要…

Redis列表(List):實現隊列/棧的利器,底層原理與實戰

Redis列表&#xff08;List&#xff09;&#xff1a;實現隊列/棧的利器&#xff0c;底層原理與實戰 1. Redis列表概述 1.1 什么是Redis列表 Redis列表&#xff08;List&#xff09;是一個有序的字符串元素集合&#xff0c;支持在頭部和尾部進行高效的插入和刪除操作。它可以…

OpenCV 圖像雙三次插值

文章目錄 一、簡介 二、實現代碼 三、實現效果 參考資料 一、簡介 在數學中,雙三次插值是三次樣條插值(一種將三次插值應用于數據集的方法)的擴展,用于在二維規則網格上插值數據點。插值曲面(指核形狀,而非圖像)比通過雙線性插值或最近鄰插值獲得的相應曲面更平滑。雙三…

【Java實戰?】Spring Security:為Spring Boot應用筑牢安全防線

目錄 一、Spring Security 概述 1.1 Spring Security 核心功能 1.2 Spring Security 與 Shiro 對比 二、Spring Boot 整合 Spring Security 基礎 2.1 整合依賴導入 2.2 默認安全配置 2.3 自定義用戶認證 2.4 自定義登錄與注銷 三、Spring Security 授權控制 3.1 基于角色的授權…

linux命令—stat

命令簡介 stat是Linux中用于查看文件或文件系統的詳細狀態信息的強大命令。它比ls -l更全面&#xff0c;其輸出信息包括但不限于&#xff1a;文件大小、權限、所有者、最后訪問/修改/狀態變更時間、inode號、所在設備信息等。 用法 stat命令的語法格式如下 stat [選項] 文件…

解決串口數據亂序問題

環境&#xff1a;jetson nano ubuntu 20.04python 3.12終于是找到解決串口亂序的最佳解決辦法了&#xff0c;先來看看什么是串口亂序&#xff1a;這就是一個典型的串口亂序&#xff0c;我的發送端發送 的協議為0x55 0x51 ...0x55 0x52 ...0x55 0x53 ...0x55 0x54 ...在這四條協…

Spring的注解

聲明Bean的注解 ?Component ?Controller ?Service ?Repository 后三種為Component的別名&#xff0c;之所以不同是因為可讀性的考慮 Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented Component public interface Controller {AliasFor(//別名an…

UVM寄存器模型與通道機制

接續UVM基礎入門文章。前言重點講述UVM常用的接口連接方式。寄存器模型&#xff1a;UVM寄存器模型&#xff08;Register Model&#xff09;是一組高級抽象的類&#xff0c;用于對DUT&#xff08;Design Under Test&#xff09;中具有地址映射的寄存器和存儲器進行建模&#xff…

12.NModbus4在C#上的部署與使用 C#例子 WPF例子

一、Modbus TCP/IP是什么Modbus TCP/IP是一種基于TCP/IP協議的工業自動化通信協議。它在Modbus協議的基礎上&#xff0c;利用TCP/IP網絡進行數據傳輸&#xff0c;使得工業設備之間的通信更加便捷和高效。常用的Modbus功能碼包括0x03&#xff08;讀保持寄存器&#xff09;、0x06…

硬件開發2-匯編1(ARMv7-A)- 基本概要

一、匯編基本概要1、ARM數據和指令類型2、ARM字節順序即可大端存儲也可小端存儲&#xff0c;默認小端存儲&#xff08;不建議修改&#xff09;、kernel&#xff08;內核&#xff09;中的&#xff0c;CPSR&#xff08;當前程序狀態寄存器&#xff09;可修改大小端存儲3、ARM處理…

Linux中進程和線程常用的API詳解

進程與線程基礎及 Linux 進程間通信&#xff08;IPC&#xff09;詳解 一、程序與進程 1. 程序&#xff08;靜態文件&#xff09; 程序是存儲在磁盤上的可執行文件&#xff0c;是靜態實體&#xff0c;不占用 CPU、內存等運行時資源&#xff0c;僅占用磁盤空間。不同操作系統的可…

VS Code 插件開發教程

VS Code 插件開發教程 概述 Visual Studio Code&#xff08;簡稱 VS Code&#xff09;是一款由 Microsoft 開發的開源輕量級編輯器&#xff0c;支持跨平臺&#xff08;Windows、macOS、Linux&#xff09;。 其最大的優勢之一是強大的插件系統&#xff0c;開發者可以通過編寫擴…

Docker技術解析

1.Docker安裝 1.如果Ubuntu自帶的Docker版本太低&#xff0c;我們需要卸載舊版本并安裝新的 sudo apt-get remove docker docker-engine docker.io containerd runc2. 備份原有軟件源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak3.選擇合適的鏡像源 # 或者使用…

TCP套接字的使用

Java中使?TCP協議通信,使用ServerSocket來建立鏈接,使用Socket進行通信.ServerSocketServerSocket是創建TCP服務端Socket的api,主要方法:方法簽名說明ServerSocket(int port)創建一個服務端流套接字Socket,并綁定指定端口Socket accpet()開始監聽指定端口,有客戶端鏈接后,返回…

linux執行systemctl enable xxxxx 報 Failed to execute operation: Bad message

linux執行systemctl enable redis.service 報 Failed to execute operation: Bad message 如果在執行 systemctl enable 命令時遇到 "Failed to execute operation: Bad message" 錯誤&#xff0c;可能是由于以下幾個原因導致的。你可以按照以下步驟進行排查和解決&a…