【C++初階】----模板初階

1.泛型函數

泛型編程:編寫與類型無關的通用代碼,是代碼復用的一種手段。模板是泛型編程的基礎。
在這里插入圖片描述

2.函數模板

2.1函數模板的概念

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

2.2函數模板格式

template<typename T1,typename T2...,typename Tn>//寫法1
返回值類型 函數名(參數列表)
{}
template<class T1,class T2... class Tn>//寫法2
返回值類型 函數名(參數列表)
{}

注意:typename是用來定義模板參數關鍵字也可以使用class(切記:不能使用struct代替class)

template<class T>
void Swap(T& x, T& y)
{T tmp = x;x = y;y = tmp;
}

2.3函數模板的原理

函數模板是一個藍圖,它本身并不是函數,是編譯器用使用方式產生特定具體類型函數的模具。所以其實模板就是將本來應該我們做的重復的事情交給了編譯器

用函數模版生成對應的函數 -> 模版的實例化
在這里插入圖片描述
在編譯器編譯階段,對于模板函數的使用,編譯器需要根據傳入的實參類型來推演生成對應類型的函數以供調用。比如:當用double類型使用函數模板時,編譯器通過對實參類型的推演,將T確定為double類型,然后產生一份專門處理double類型的代碼,對于字符類型也是如此。

2.4函數模板的實例化

用不同類型的參數使用函數模板時,稱為函數模板的實例化。模板參數實例化分為:隱式實例化和顯式實例化。

#include<iostream>
using namespace std;template<class T>
T Add(const T& x, const T& y)
{return x + y;
}int main()
{int a1 = 1;int b1 = 2;double a2 = 1.1;double b2 = 2.2;//隱式實例化,讓編譯器根據實參推演模板參數的實際類型cout << Add(a1, b1) << endl;cout << Add(a2, b2) << endl;//通過實參a1將T推演為int,通過實參a2將T推演為double類型,//但模板參數列表中只有一個T//編譯器無法確定此處到底該將T確定為int 或者 double類型而報錯//兩種處理方式:1.用戶自己來強制類型轉換 2.使用顯示實例化cout << Add(a1, (int)a2) << endl;//強轉cout << Add<int>(a1, a2) << endl;//顯式實例化return 0;
}

2.5 模板參數的匹配原則

  1. 一個非模板函數可以和一個同名的函數模板同時存在,而且該函數模板還可以被實例化為這個非模板函數
  2. 對于非模板函數和同名函數模板,如果其他條件都相同,在調動時會優先調用非模板函數而不會從該模板產生出一個實例。如果模板可以產生一個具有更好匹配的函數, 那么將選擇模板
#include<iostream>
using namespace std;template<class T>
T Add(const T& x, const T& y)
{return x + y;
}int Add(int x, int y)
{return x + y;
}int main()
{//與非函數模板類型完全匹配,不需要函數模板實例化Add(1, 2);//模板函數可以生成更加匹配的版本,編譯器根據實參生成更加匹配的Add函數Add(1, 2.2);return 0;
}
  1. 模板函數不允許自動類型轉換,但普通函數可以進行自動類型轉換
    在這里插入圖片描述

3.類模板

3.1模板的定義格式

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

3.2類模板的實例化

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

// Stack是類名,Stack<int>才是類型
Stack<int> st1;    // int
Stack<double> st2; // double

模版不建議聲明和定義分離到兩個文件.h 和.cpp會出現鏈接錯誤

#include<iostream>
using namespace std;template<class T>
class Stack
{
public://構造Stack(int n=4):_array(new T[n]),_size(0),_capacity(n){}//析構~Stack(){delete[] _array;_size = _capacity = 0;}//聲明void Push(const T& x);private:T* _array;size_t _size;size_t _capacity;
};//定義
//每個函數模板都得定義自己的模板參數
template<class T>
void Stack<T>::Push(const T& x)
{//擴容if (_size == _capacity){T* tmp = new T[_capacity * 2];memcpy(tmp, _array, sizeof(T) * _size);delete[] _array;_array = tmp;_capacity *= 2;}_array[_size++] = x;
}int main()
{//類名<類型> 變量Stack<int> st1;st1.Push(1);st1.Push(2);st1.Push(3);Stack<double> st2;st2.Push(1.1);st2.Push(2.2);st2.Push(3.3);return 0;
}

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

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

相關文章

git-- github的使用--賬戶和本地連接

以下指令在git 執行bash 流程&#xff1a;先看有沒有密鑰&#xff1b; 沒有的話&#xff0c;在電腦生成密鑰對&#xff0c;公鑰復制到github&#xff1b; 要想使用https&#xff0c;配置令牌&#xff0c;注意令牌有期限問題&#xff0c;連接不了有可能是期限問題 一個電腦對…

OTN(Optical Transport Network)詳解

OTN&#xff08;光傳送網&#xff09;是一種基于**波分復用&#xff08;WDM&#xff09;**的大容量光傳輸技術&#xff0c;結合了SDH的運維管理優勢和WDM的高帶寬特性&#xff0c;廣泛應用于骨干網、城域核心層及數據中心互聯&#xff08;DCI&#xff09;。 1. OTN 的基本概念 …

Python 中列表(List)、元組(Tuple)、集合(Set)和字典(Dict)四大數據結構的完整對比

以下是 Python 中列表&#xff08;List&#xff09;、元組&#xff08;Tuple&#xff09;、集合&#xff08;Set&#xff09;和字典&#xff08;Dict&#xff09;四大數據結構的完整對比分析&#xff0c;結合了核心特性、操作方式和應用場景的深度總結&#xff1a; 一、核心特性…

Angular由一個bug說起之十五:自定義基于Overlay的Tooltip

背景 工具提示&#xff08;tooltip&#xff09;是一個常見的 UI 組件&#xff0c;用于在用戶與頁面元素交互時提供額外的信息。由于angular/material/tooltip的matTooltip只能顯示純文本&#xff0c;所以我們可以通過自定義Directive來實現一個靈活且功能豐富的tooltip Overlay…

軟件工程面試題(十五)

1、servlet 創建過程以及ruquest,response,session的生命周期? Servlet的創建過程: 第一步 public class AAA extends HttpServlet{ 實現對應的doxxx方法 } 第二步: 在web.xml中配置 <servlet> <servlet-name></servlet-name> <servlet-c…

搭建QNX Software Center的Docker環境

背景 本人使用 Ubuntu Server 22.04 服務器&#xff0c;所以沒有圖形界面&#xff0c;而 QNX Software Center 需要圖形界面。為了保證服務器環境的整理&#xff0c;計劃使用Docker部署QNX Software Center 一瓶安裝圖形界面。本方既是實現方案的記錄。 資源 Dockerfile&…

C#/.NET/.NET Core技術前沿周刊 | 第 31 期(2025年3.17-3.23)

前言 C#/.NET/.NET Core技術前沿周刊&#xff0c;你的每周技術指南針&#xff01;記錄、追蹤C#/.NET/.NET Core領域、生態的每周最新、最實用、最有價值的技術文章、社區動態、優質項目和學習資源等。讓你時刻站在技術前沿&#xff0c;助力技術成長與視野拓寬。 歡迎投稿、推薦…

粘包問題解決方案

粘包問題詳解&#xff1a;TCP協議中的常見問題及Go語言解決方案 一、什么是粘包問題&#xff1f; 粘包問題是指在TCP通信中&#xff0c;發送方發送的多個獨立消息在接收方被合并成一個消息接收的現象。換句話說&#xff0c;發送方發送的多條消息在接收方被“粘”在一起&#…

vue:突然發現onok無法使用

const that this;this.$confirm({title: "修改商品提示",content: "如果當前商品存在于商品活動庫&#xff0c;則在商品活動庫的狀態會下架",onOk: function () {that.submitForm();}}); 突然發現 this.$confirm無法進入onok 最終發現是主題沖突&#x…

redis hashtable 的sizemask理解

在 Redis 的哈希表實現中&#xff0c;index hash & dict->ht[0].sizemask 是計算鍵值對應存儲位置的核心操作。這個操作看起來簡單&#xff0c;但背后涉及哈希表的內存布局和性能優化策略。我們通過以下步驟逐步解析其原理&#xff1a; 一、哈希表的設計目標 快速定位…

Ruby 命令行選項

Ruby 命令行選項 概述 Ruby 是一種廣泛使用的編程語言,它擁有強大的命令行工具,可以幫助開發者進行各種任務。了解 Ruby 的命令行選項對于提高開發效率至關重要。本文將詳細介紹 Ruby 的常用命令行選項,幫助開發者更好地利用 Ruby 的命令行功能。 Ruby 命令行選項概述 R…

【STM32】WDG看門狗(學習筆記)

學習來源----->江協科技STM32 WDG簡介 WDG&#xff08;Watchdog&#xff09;看門狗看門狗可以監控程序的運行狀態&#xff0c;當程序因為設計漏洞、硬件故障、電磁干擾等原因&#xff0c;出現卡死或跑飛現象時&#xff0c;看門狗能及時復位程序&#xff0c;避免程序陷入長…

Java 數據庫連接池

HikariCP 老外開源的。 Spring Boot 2 之后默認選擇的連接池。 號稱性能最快的數據庫連接池。 為什么性能好呢&#xff1f; ● 字節碼級別的優化-盡量的利用 JIT 的內聯手段 ● 字節碼級別的優化-利用更容易被 JVM 優化的指令 ● 代碼級別的優化-利用改造后的 FastList 代替…

Spring Boot中@Valid 與 @Validated 注解的詳解

Spring Boot中Valid 與 Validated 注解的詳解 引言Valid注解功能介紹使用場景代碼樣例 Validated注解功能介紹使用場景代碼樣例 Valid與Validated的區別結論 引言 在Spring Boot應用中&#xff0c;參數校驗是確保數據完整性和一致性的重要手段。Valid和Validated注解是Spring …

C++搜索

功能擴展說明&#xff1a; 圖類封裝&#xff1a;將圖數據結構封裝為類&#xff0c;提高代碼復用性 最短路徑查找&#xff1a;基于BFS實現未加權圖的最短路徑查找 路徑重構&#xff1a;通過parent數組回溯構建完整路徑 異常處理&#xff1a;當路徑不存在時返回空向量 復雜度分析…

2023第十四屆藍橋杯大賽軟件賽國賽C/C++ 大學 B 組(真題題解)(C++/Java題解)

本來想刷省賽題呢&#xff0c;結果一不小心刷成國賽了 真是個小迷糊〒▽〒 但&#xff0c;又如何( ?? ω ?? )? 記錄刷題的過程、感悟、題解。 希望能幫到&#xff0c;那些與我一同前行的&#xff0c;來自遠方的朋友&#x1f609; 大綱&#xff1a; 一、子2023-&#xff…

CSS學習筆記6——網頁布局

目錄 一、元素的浮動屬性、清除浮動 清除浮動的其他方法 1、使用空標簽清除浮動影響 2、使用overflow屬性清除浮動 3、使用偽元素清除浮動影響 原理 overflow屬性 二、元素的定位 1、相對定位 2、絕對定位 ?編輯 3、固定定位 z-index層疊等級屬性 一、元素的浮動…

sqlalchemy:將mysql切換到OpenGauss

說明 之前python的項目使用的mysql&#xff0c;近期要切換到國產數據庫OpenGauss。 之前的方案是fastapisqlalchemy&#xff0c;測試下來發現不用改代碼&#xff0c;只要改下配置即可。 切換方案 安裝openGauss-connector-python-psycopg2 其代碼工程在&#xff1a;https:…

uniapp 獲取dom信息(封裝獲取元素信息工具函數)

在uniapp開發中&#xff0c;需要獲取到dom的信息&#xff0c;需要用到uniapp的指定方式 uni.createSelectorQuery()&#xff0c;但是每次需要用到的時候都需要很長一段的繁瑣代碼&#xff0c;本篇文章將呈現獲取dom信息方法封裝&#xff0c;話不多說&#xff0c;上菜&#xff1…

Linux之數據鏈路層

Linux之數據鏈路層 一.以太網1.1以太網幀格式1.2MAC地址1.3MTU 二.ARP協議2.1ARP協議工作流程2.2ARP協議格式 三.NAT技術四.代理服務4.1正向代理4.2反向代理 五.四大層的學習總結 一.以太網 在我們學習完了網絡層后我們接下來就要進入數據鏈路層的學習了&#xff0c;在學習完網…