C++中的模板(上)

C++中的模板(上)

模板參數和函數參數是很像的,函數參數定義的形參對象,而模板參數定義的是類型.

模板分為函數模板和類模板

函數模板

一個交換兩個數的函數模板:

template<class T> // 此處typename和class是等價的
void Swap(T &a, T &b)
{T temp = a;a = b;b = temp;
}

可以給這里的函數傳遞任何類型的參數.

任何類型的值都是可以傳遞的:

void Test1()
{int a = 1, b = 2;Swap(a, b);cout << a << " " << b << endl;double c = 1.1, d = 2.2;Swap(c, d);cout << c << " " << d << endl;
}

這里的ab和cd變量表面上調用的是同一個函數,實際上調用的函數是不同的,因為編譯器會根據類型自動推斷,如果推斷出不同的類型就會在編譯的時候生成不同的函數.

編譯器這個生成函數的過程稱之為模板的實例化.

用不同的參數實例化函數模板時,成為函數模板的實例化.模板參數實例化分為:隱式實例化和顯式實例化.

函數模板可以顯式的實例化也可以通過傳遞參數自動推出模板參數的類型,但是類模板都是顯式實例化.

函數模板的顯式實例化:

template<class T>
T Add(T a, T b)
{return a + b;
}
void Test2()
{cout<<Add(1,2)<<endl; // 隱式實例化,通過參數傳遞自動推出模板參數的類型cout<<Add<int>(1,2)<<endl; // 顯式實例化.cout<<Add<double>(1.1,2)<<endl;
}

注意:

普通函數和模板函數是可以同時存在的.例如:

// 普通函數
int Add(int a,int b)
{return a + b;
}
// 函數模板
template<class T>
int Add(const T& a,const T& b)
{return a + b;
}

這樣函數在調用的時候,會自動根據最佳類型進行匹配.

類模板

類模板的寫法與函數模板類似的:

template<class T>
class Stack
{
public:Stack(int capacity = 3):_capacity(capacity){cout<<"Stack<T>::Stack(int capacity)"<<endl;_a = new T[_capacity];_top = 0;}~Stack();
private:T* _a;int _top;int _capacity;
};
  • 對于沒有使用模板語法的類的類名就是就是它的類型.例如以下的例子:

    class A
    {
    private: int _a;
    public:}
    int main()
    {A a;
    }
    

    A類就是一個沒有使用任何類模板語法的普通類,a對象對應的類型就是A.

  • 而對于使用了類模板的類來講,類的類型不僅僅是類名,還需要包含類模板中的模板類型,例如:

    template<class T>
    class Stack
    {
    public:Stack(int capacity = 3):_capacity(capacity){cout<<"Stack<T>::Stack(int capacity)"<<endl;_a = new T[_capacity];_top = 0;}~Stack();
    private:T* _a;int _top;int _capacity;
    };
    int main()
    {Stack<int> stack1;Stack<double> stack2;return 0;
    }
    

    例如這個stack1對象的類型就是 Stack<int>,這個stack2對象的類型就是 Stack<double>,而 Stack<int>Stack<double> 是不同的類型.

模板類的聲明與定義分離

模板類中方法的聲明與普通類中方法的聲明是一樣的.

但是在方法的定義的前面要指定類的類型(注意:模板類的類型是類名<類型>),同時需要在方法定義的上面一排聲明模板參數.例如要將Stack類的構造方法的聲明與定義分離的做法:

template<class T>
class Stack
{
public:// 方法聲明Stack(int capacity = 3);~Stack();void Print();
private:T* _a;int _top;int _capacity;
};// 方法定義
template<class T> // 聲明模板參數
Stack<T>::Stack(int capacity )
:_capacity(capacity)
{   cout<<"Stack<T>::Stack(int capacity)"<<endl;_a = new T[_capacity];_top = 0;
} 
// 方法定義
template<class T>
Stack<T>::~Stack()
{delete[] _a;_a = nullptr;_top = 0;_capacity = 0;cout<<"Stack<T>::~Stack()"<<endl;
}
// 方法定義
template<class T>
void Stack<T>::Print()
{cout<<"top = "<<_top<<endl;
}

對于普通類而言,類中方法的聲明與定義是可以在不同的文件中的.

但是對于模板類,方法的聲明與定義是不支持在不同文件中的.不能像普通類那樣將類的聲明放到頭文件中,將方法的定義放在源文件中.

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

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

相關文章

MySQL面試題----如何進行 MySQL 數據庫備份與恢復

MySQL 數據庫備份 1. 使用 mysqldump 工具(邏輯備份) 全量數據庫備份 該方式會備份指定數據庫中的所有數據和表結構。在命令行中輸入以下命令,將 username 替換為你的 MySQL 用戶名,password 替換為對應的密碼,database_name 替換為要備份的數據庫名,backup.sql 為備份文…

Java集合面試總結(題目來源JavaGuide)

問題1&#xff1a;說說 List,Set,Map 三者的區別&#xff1f; 在 Java 中&#xff0c;List、Set 和 Map 是最常用的集合框架&#xff08;Collection Framework&#xff09;接口&#xff0c;它們的主要區別如下&#xff1a; 1. List&#xff08;列表&#xff09; 特點&#xf…

deepseek接入pycharm 進行AI編程

要將DeepSeek接入PyCharm進行AI編程,可以按照以下步驟操作: ### 1. 獲取DeepSeek API訪問權限 DeepSeek通常以API的形式對外提供服務,你需要在其官方網站注冊賬號,申請API訪問權限。在申請通過后,會獲得API密鑰(API Key),這是后續調用API的關鍵憑證。 ### 2. 安裝必要…

奧迪改名風波再起,A6L能否率隊創下新奇跡

文/王俁祺 導語&#xff1a;春節假期剛過&#xff0c;奧迪的車型命名規則又變了。在如今以內卷為主基調的環境下&#xff0c;車型改名可不是小事&#xff0c;而奧迪的這次調整背后藏著許多深意&#xff0c;也預示著2025年奧迪在產品布局上的新動向。 改名能否“改命” 回溯到…

【怎么用系列】短視頻戒除-1-對推薦算法進行干擾

如今推薦算法已經滲透到人們生活的方方面面&#xff0c;尤其是抖音等短視頻核心就是推薦算法。 【短視頻的危害】 1> 會讓人變笨&#xff0c;慢慢讓人喪失注意力與專注力 2> 讓人喪失閱讀長文的能力 3> 讓人沉浸在一個又一個快感與嗨點當中。當我們刷短視頻時&#x…

改進Transformer,解讀Tokenformer論文:基于參數分詞化重新思考Transformer的擴展策略

Transformer 訓練成本高昂的問題日益凸顯&#xff0c;不僅需要耗費巨額的資金與大量的計算資源&#xff0c;還對環境產生了不可忽視的影響&#xff0c;最近由北京大學與谷歌聯合發表的一篇論文&#xff0c;為這一棘手難題帶來了全新的曙光。論文中提出的創新方案&#xff0c;有…

【STM32】HAL庫USB虛擬U盤MSC配置及采用自帶的Flash作為文件系統

【STM32】HAL庫USB虛擬U盤MSC實現配置及采用自帶的Flash作為文件系統 本文將自帶的Flash作為文件系統 通過配置USB的MSC功能實現虛擬U盤 沒有單獨建立FATFS文件系統 僅僅是配置USB和Flash讀寫而已 當然 這里也可以用外部Flash等等 也可以配置文件系統來進行套殼 但總體而言不如…

Noise Conditional Score Network

NCSN p σ ( x ~ ∣ x ) : N ( x ~ ; x , σ 2 I ) p_\sigma(\tilde{\mathrm{x}}|\mathrm{x}) : \mathcal{N}(\tilde{\mathrm{x}}; \mathrm{x}, \sigma^2\mathbf{I}) pσ?(x~∣x):N(x~;x,σ2I) p σ ( x ~ ) : ∫ p d a t a ( x ) p σ ( x ~ ∣ x ) d x p_\sigma(\mathrm…

jdk8 G1收集器怎么手動調優

在 JDK 8 中&#xff0c;手動調優 G1 垃圾收集器可以通過以下步驟和參數進行&#xff1a; 1. 啟用 G1 垃圾收集器 要啟用 G1 垃圾收集器&#xff0c;需要在 JVM 啟動參數中添加以下選項&#xff1a; -XX:UseG1GC 這個參數告訴 JVM 使用 G1 作為垃圾收集器。 2. 設置堆內存…

Nginx通過設置自定義標記識別代理調用

Nginx通過設置自定義標記識別代理調用 業務場景 最近遇到一個業務場景&#xff0c;部署在云端服務器的一個平臺&#xff0c;接口提供給多個現場調用&#xff0c;其中一個現場是通過nginx代理服務器代理轉發到云服務器&#xff0c;另外一個現場則是直接通過云服務器接口進行調…

前端知識速記:POST和GET

前端知識速記&#xff1a;POST和GET請求的區別 一、GET請求概述 GET請求是一種用于獲取服務器資源的請求方式。**使用GET請求時&#xff0c;數據通過URL傳遞&#xff0c;適合用于獲取數據而不修改資源。**以下是GET請求的一些基本特征&#xff1a; 數據附在URL后面&#xff…

axios如何利用promise無痛刷新token

目錄 需求 需求解析 實現思路 方法一&#xff1a; 方法二&#xff1a; 兩種方法對比 實現 封裝axios基本骨架 instance.interceptors.response.use攔截實現 問題和優化 如何防止多次刷新token 同時發起兩個或以上的請求時&#xff0c;其他接口如何重試 最后完整代…

【DeepSeek系列】01 DeepSeek-V1 快速入門

1、DeepSeek簡介 2024年底&#xff0c;DeepSeek 相繼推出了其第一代推理大模型&#xff1a;DeepSeek-R1-Zero 和 DeepSeek-R1。 DeepSeek-R1-Zero 是一個通過大規模強化學習&#xff08;RL&#xff09;訓練的模型&#xff0c;訓練過程中沒有使用監督微調&#xff08;SFT&…

基于LabVIEW的Modbus-RTU設備通信失敗問題分析與解決

在使用 LabVIEW 通過 Modbus-RTU 協議與工業設備進行通信時&#xff0c;可能遇到無法正常發送或接收指令的問題。常見原因包括協議參數配置錯誤、硬件連接問題、數據幀格式不正確等。本文以某 RGBW 控制器調光失敗為例&#xff0c;提出了一種通用的排查思路&#xff0c;幫助開發…

【初/高中生講機器學習】0. 本專欄 “食用” 指南——寫在一周年之際?

創建時間&#xff1a;2025-01-27 首發時間&#xff1a;2025-01-29 最后編輯時間&#xff1a;2025-01-29 作者&#xff1a;Geeker_LStar 你好呀~這里是 Geeker_LStar 的人工智能學習專欄&#xff0c;很高興遇見你~ 我是 Geeker_LStar&#xff0c;一名高一學生&#xff0c;熱愛計…

密云生活的初體驗

【】在《歲末隨筆之碎碎念》里&#xff0c;我通告了自己搬新家的事情。乙巳年開始&#xff0c;我慢慢與大家分享自己買房裝修以及在新家的居住體驗等情況。 跳過買房裝修的內容&#xff0c;今天先說說這三個月的生活體驗。 【白河】 潮白河是海河水系五大河之一&#xff0c;貫穿…

系統通解:超多視角理解

在科學研究和工程應用中&#xff0c;我們常常面臨各種復雜系統&#xff0c;需要精確描述其行為和變化規律。從物理世界的運動現象&#xff0c;到化學反應的進程&#xff0c;再到材料在受力時的響應&#xff0c;這些系統的行為往往由一系列數學方程來刻畫。通解&#xff0c;正是…

Python爬蟲:1藥城店鋪爬蟲(完整代碼)

??????????歡迎來到我的博客?????????? &#x1f434;作者&#xff1a;秋無之地 &#x1f434;簡介&#xff1a;CSDN爬蟲、后端、大數據領域創作者。目前從事python爬蟲、后端和大數據等相關工作&#xff0c;主要擅長領域有&#xff1a;爬蟲、后端、大數據…

openwebui入門

1 簡介 ?Open WebUI?&#xff08;網址是openwebui.com&#xff09;是一個高度可擴展、功能強大且用戶友好的自托管Web用戶界面&#xff0c;專為完全離線操作設計&#xff0c;編程語言是python。它支持對接Ollama和OpenAI兼容的API的大模型。? Open WebUI?在架構上是一種中…

Day36-【13003】短文,數組的行主序方式,矩陣的壓縮存儲,對稱、三角、稀疏矩陣和三元組線性表,廣義表求長度、深度、表頭、表尾等

文章目錄 本次課程內容第四章 數組、廣義表和串第一節 數組及廣義表數組的基本操作數組的順序存儲方式-借用矩陣行列式概念二維數組C語言對應的函數-通常行主序方式 矩陣的壓縮存儲對稱矩陣和三角矩陣壓縮存儲后&#xff0c;采用不同的映射函數稀疏矩陣-可以構成三元組線性表三…