【C++】泛型編程 ? ( 類模板 static 關鍵字 | 類模板 static 靜態成員 | 類模板使用流程 )

文章目錄

  • 一、類模板使用流程
    • 1、類模板 定義流程
    • 2、類模板 使用
    • 3、類模板 函數 外部實現
  • 二、類模板 static 關鍵字
    • 1、類模板 static 靜態成員
    • 2、類模板 static 關鍵字 用法
    • 3、完整代碼示例


將 類模板 函數聲明 與 函數實現 分開進行編碼 , 有 三種 方式 :

  • 類模板 的 函數聲明 與 函數實現 都寫在同一個類中 , 也就是沒有分開進行編碼 ;
  • 類模板 的 函數實現 在 類外部進行 , 函數聲明 和 實現 寫在相同的 .cpp 源碼文件中 ;
  • 類模板 的 函數實現 在 類外部進行 , 函數聲明 和 實現 寫在不同的 .h 和 .cpp 源碼文件中 ;

在博客 【C++】泛型編程 ⑨ ( 類模板的運算符重載 - 函數聲明 和 函數實現 寫在同一個類中 | 類模板 的 外部友元函數問題 ) 中實現了第一種情況 , 類模板 的 函數聲明 與 函數實現 都寫在同一個類中 , 也就是沒有分開進行編碼 ;

在博客 【C++】泛型編程 ⑩ ( 類模板的運算符重載 - 函數實現 寫在類外部的同一個 cpp 代碼中 | 類模板 的 外部友元函數二次編譯問題 ) 中 , 分析了 第二種情況 , 類模板 的 函數實現 在 類外部進行 , 寫在 一個 cpp 源碼文件中 ;

在博客 【C++】泛型編程 ? ( 類模板的運算符重載 - 函數實現 寫在類外部的不同的 .h 頭文件和 .cpp 代碼中 ) 中 , 分析 第三種 情況 , 函數實現 在 類外部進行 , 函數聲明 和 實現 寫在不同的 .h 和 .cpp 源碼文件中 ;





一、類模板使用流程




1、類模板 定義流程


類模板 定義流程 :

  • 首先 , 定義一個 使用 實際數據類型 的類 , 這里的數據類型 指的是 成員變量類型 或 成員函數 參數或返回值 類型 ; 這些類型 由于是 實際類型 , 語義明確 , 含義清楚 , 不會報錯 ;
  • 然后 , 將 要使用 泛型模板 的 類型 , 改為一個 自己定義的 虛擬泛型類型 , 如 : template <typename T> 中的 T 類型 ;
  • 最后 , 在 類聲明 前面加上 template <typename T> , 其中的 T 類型可以改為其它字母代替 , 一般是大寫字母 ;

2、類模板 使用


使用類模板 : 使用 類模板 創建實例對象時 , 首先要注明 具體類型 , 生成具體類 , 才能創建具體類的 實例對象 , 語法格式如下 ;

類模板名稱<實際類型名稱> 對象名稱;
類模板名稱<實際類型名稱> 對象名稱(構造函數實參列表);

以 上一篇博客的 Student 類模板為例 , 創建 Student 類模板實例對象示例如下 ;

Student<int> s;
Student<int> s(1, 2);

3、類模板 函數 外部實現


如果要在 類模板 之外 實現 類模板中的 成員函數 ,

首先 ,聲明 類模板 的類型參數 ;

template <typename 類型參數列表>

然后 , 使用 域操作符 :: 訪問類模板中的函數 , 訪問時需要 注明 類模板的 實際參數類型 ;

函數返回值類型 類模板名稱<實際參數類型列表>::成員函數名(函數形參列表)
{
} 

特別注意 , 如果上面的類型中 , 涉及到的 函數返回值類型 或 函數形參列表 中 , 有 類模板類型 , 也要注明 實際的參數類型 ;


如下面的 operator+ 函數 ,

template <typename T>
class Student
{
public:// 重載 + 運算符Student operator+(Student& s);
};

在 類模板 外部 實現上述 函數聲明 , 就需要使用如下方式 ;

// 重載 + 運算符
// 使用  Student<T>:: 域操作符訪問函數
template <typename T>
Student<T> Student<T>::operator+(Student<T>& s)
{// 函數內部的類的 <T> 模板類型 , 可加 Student<T> 可不加 Student// 不加 <T> 也可以使用 , 加了也不會報錯Student student(this->a + s.a, this->b + s.b);return student;
}




二、類模板 static 關鍵字




1、類模板 static 靜態成員


類模板中 , 定義了 static 靜態成員變量 ;

靜態 成員變量 是屬于整個類的 , 但是對于 類模板 來說 , 存在著二次編譯 , 會生成多個不同的實際類 ;


類模板 的 實際類型 可能有多種 , 如 Student<int>Student<double> 是兩個具體的實際類型 , C++ 編譯器會將 類模板 編譯成 兩個不同的 類 ;

上述 編譯成的 不同的類 , 每個類 都有一個 static 靜態成員 , 相互之間是獨立的 ;


2、類模板 static 關鍵字 用法


類模板 static 關鍵字 用法 :

首先 , 在 類模板 中 , 聲明 static 靜態成員 ;

template <typename T>
class Student
{
public:// 類模板中的靜態成員static T m_a;
};

然后 , 在類外部 , 初始化靜態成員 , 之后才能 使用該靜態成員 , 使用 靜態成員 時 , 要聲明 類模板 類型 template <typename T> , 下面使用 域作用符 訪問時 , 需要注明 類模板類型 ;

// 初始化靜態成員
template <typename T>
T Student<T>::m_a = 0;

最后 , 使用 類模板 中的靜態成員時 , 每個 生成的 具體類型 , 都有一個獨立互不干擾的 靜態成員 ; 下面 Student<int> 類型的對象 s1 , s2 共享 靜態成員 m_a , Student<double> 類型的對象 s3 , s4 共享 靜態成員 m_a ; s1 和 s3 是不同的靜態成員 ;

Student<int> s1, s2;
Student<double> s3, s4;

3、完整代碼示例


代碼示例 :

#include "iostream"
using namespace std;template <typename T>
class Student
{
public:// 類模板中的靜態成員static T m_a;
};// 初始化靜態成員
template <typename T>
T Student<T>::m_a = 0;int main() {Student<int> s1, s2;cout << "s1, s2 賦值前 : s1.m_a : " << s1.m_a << " , s2.m_a : " << s2.m_a << endl;s1.m_a = 6;cout << "s1, s2 賦值后 : s1.m_a : " << s1.m_a << " , s2.m_a : " << s2.m_a << endl;Student<double> s3, s4;cout << "s3, s4 賦值前 : s3.m_a : " << s3.m_a << " , s4.m_a : " << s4.m_a << endl;s3.m_a = 8;cout << "s3, s4 賦值后 : s1.m_a : " << s1.m_a << " , s2.m_a : " << s2.m_a << endl;cout << "s3, s4 賦值后 : s3.m_a : " << s3.m_a << " , s4.m_a : " << s4.m_a << endl;// 控制臺暫停 , 按任意鍵繼續向后執行system("pause");return 0;
}

執行結果 :

s1, s2 賦值前 : s1.m_a : 0 , s2.m_a : 0
s1, s2 賦值后 : s1.m_a : 6 , s2.m_a : 6
s3, s4 賦值前 : s3.m_a : 0 , s4.m_a : 0
s3, s4 賦值后 : s1.m_a : 6 , s2.m_a : 6
s3, s4 賦值后 : s3.m_a : 8 , s4.m_a : 8
請按任意鍵繼續. . .

在這里插入圖片描述

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

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

相關文章

數據結構 二叉樹

二叉樹 二叉樹是n個有限元素的集合&#xff0c;該集合或者為空、或者由一個稱為根&#xff08;root&#xff09;的元素及兩個不相交的、被分別稱為左子樹和右子樹的二叉樹組成&#xff0c;是有序樹。當集合為空時&#xff0c;稱該二叉樹為空二叉樹。在二叉樹中&#xff0c;一個…

【8】Spring Boot 3 集成組件:安全組件 spring security【官網概念篇】

目錄 【8】Spring Boot 3 集成組件&#xff1a;安全組件 spring securitySpring Security 簡介先決條件引入依賴身份驗證密碼存儲密碼存儲歷史DelegatingPasswordEncoder密碼存儲格式密碼加解密類自定義密碼存儲 體系結構 ArchitectureServlet 過濾器DelegatingFilterProxyFilt…

第二十章 多線程

20.2創建線程 20.2.1繼承Thread類 Thread類是Java.lang包中的一個類&#xff0c;從這個類中實例化的對象代表線程&#xff0c;程序員啟動一個新線程需要建議Thread實例。 public class ThreadTest extedns Thread{} run方法格式&#xff1a; public void run(){} 20.1讓線程循…

mysql命令導出表結構和數據

MySQL是一款流行的關系型數據庫管理系統&#xff0c;是許多公司和組織使用的首選數據庫。在日常使用中&#xff0c;我們經常需要對數據庫進行備份和復制&#xff0c;因此必須了解如何導出表結構和表數據。以下是使用MySQL命令導出表結構和表數據的方法。 1. 導出表結構 mysql…

AnalyticDB for PostgreSQL 實時數據倉庫上手指南

AnalyticDB for PostgreSQL 實時數據倉庫上手指南 2019-04-016601 版權 本文涉及的產品 云原生數據倉庫 ADB PostgreSQL&#xff0c;4核16G 50GB 1個月 推薦場景&#xff1a; 構建的企業專屬Chatbot 立即試用 簡介&#xff1a; AnalyticDB for PostgreSQL 提供企業級數…

iOS合并代碼后解決沖突

合并主干和分支代碼后有沖突&#xff0c;xcode無法運行&#xff0c;如下圖&#xff1a;文件顯示不了&#xff0c;項目名也顯示不了 解決沖突&#xff1a; 1.選中左邊目錄欄的項目名。鼠標右鍵--> Show in Finder 2.選中項目文件 xxxx.xcodeproj。鼠標右鍵--> 顯示包內容…

【python學習】中級篇-繪制圖形:turtle庫

turtle庫是Python的一個繪圖庫&#xff0c;它提供了一個簡單的繪圖窗口&#xff0c;可以讓你通過控制一個小海龜在屏幕上移動來繪制圖形。 以下是一個簡單的turtle庫用法示例&#xff1a; 在這個示例中&#xff0c;我們首先導入了turtle庫&#xff0c;然后創建了一個畫布和一個…

【創建一個C++線程需要傳入幾個參數?】

在C++中,創建一個std::thread對象時,你可以傳遞多個參數,但至少需要一個參數:線程將要執行的函數。這個函數可以是一個普通函數、一個類的成員函數,或者一個可調用對象(如lambda表達式)。除了要執行的函數之外,你還可以傳遞任何數量的參數,這些參數將被轉發到線程函數…

idea手動導入maven包

當maven倉庫中沒有包時&#xff0c;我們需要手動導入jar到maven項目中 1.這里的maven設置成你自己安裝的maven 2.查看pom.xml文件中maven&#xff0c;以下面為例 <dependency><groupId>com.jdd.pay</groupId><artifactId>mapi-sdk-v3</artifactId&…

零基礎小白如何自學 Python 步驟和知識點?

Python是一種流行的編程語言&#xff0c;被廣泛用于Web開發、數據分析、機器學習、人工智能等領域。如果你是零基礎的Python初學者&#xff0c;不必擔心&#xff0c;以下是一些建議&#xff0c;幫助你開始Python編程之旅。 黑馬程序員python教程&#xff0c;8天python從入門到…

計網(復習自用)

計算機網絡 1.概述 1.1概念 含義 計算機網絡&#xff1a;是一個將分散的。具有獨立功能的計算機系統&#xff0c;通過通信設備和線路連接起來&#xff0c;由功能完善的軟件實現資源共享和信息傳遞的系統。 簡單點說&#xff0c;計算機網絡是互聯的&#xff0c;自治的計算機集…

js方法(數組,對象,字符串,時間,內置方法等)

目錄 1.數組方法 2. 對象方法 3. 字符串方法 4.數學方法 5. 日期和時間方法 6.內置方法 7.json方法 1.數組方法 push()&#xff1a;向數組末尾添加一個或多個元素&#xff0c;并返回新的長度。pop()&#xff1a;刪除并返回數組的最后一個元素。unshift()&#xff1a;向數…

淺談勒索病毒防護

免責聲明 文章僅做經驗分享用途&#xff0c;利用本文章所提供的信息而造成的任何直接或者間接的后果及損失&#xff0c;均由使用者本人負責&#xff0c;作者不為此承擔任何責任&#xff0c;一旦造成后果請自行承擔&#xff01;&#xff01;&#xff01; 目錄 免責聲明 一&am…

使用Python調用API接口獲取小紅書筆記詳情數據

本文將詳細介紹如何使用Python編程語言調用小紅書API接口&#xff0c;以獲取小紅書筆記的詳情數據。我們將從以下幾個方面展開討論&#xff1a;1) API接口簡介&#xff1b;2) Python環境準備&#xff1b;3) API密鑰獲取&#xff1b;4) 使用Requests庫發送API請求&#xff1b;5)…

Android系統調試工具大全:解密adb、dumpsys、procrank等神器

Android系統調試工具大全&#xff1a;解密adb、dumpsys、procrank等神器 引言 Android開發中&#xff0c;調試是一個非常重要的環節&#xff0c;本文將介紹一些常用的Android系統調試工具&#xff0c;包括adb、logcat、procrank、dumpsys、dmesg、top、free、df、trace、pm、…

【python學習】基礎篇-常用模塊-hashlib模塊:常見的哈希算法,如MD5、SHA1、SHA256等計算

Python中的hashlib模塊提供了常見的哈希算法&#xff0c;如MD5、SHA1、SHA256等。 使用hashlib模塊可以方便地計算字符串或文件的哈希值&#xff0c;常用于密碼加密、數據完整性校驗等場景。 以下是hashlib模塊中一些常見哈希算法的用法&#xff1a; 在實際應用中&#xff0c;…

vue項目引入element-plus

文章目錄 引入框架遇到的問題引入的時候&#xff0c;報錯 ...(reading replace)...報錯&#xff1a;The template root requires ...eslint報錯&#xff1a; 運行 引入框架 使用add引入 遇到的問題 引入的時候&#xff0c;報錯 …(reading ‘replace’)… Cannot read prop…

聊聊鼎叔的新書《無測試組織-測試團隊的敏捷轉型》

這是鼎叔的第八十篇原創文章。行業大牛和剛畢業的小白&#xff0c;都可以進來聊聊。 歡迎關注本公眾號《敏捷測試轉型》&#xff0c;星標收藏&#xff0c;大量原創思考文章陸續推出。 本書官方購買鏈接請點擊 https://item.jd.com/14105386.html。 為何寫作本書 對于“無測試組…

C#中委托和匿名方法

目錄 一、委托 1.委托的實例化 2.委托的調用 3.示例 二、匿名方法 為了實現方法的參數化&#xff0c;提出了委托的概念&#xff0c;委托是一種引用方法的類型&#xff0c;即委托是方法的引用&#xff0c;一旦為委托分配了方法&#xff0c;委托將與該方法具有完全相同的行為…

DOM事件的傳播機制

DOM事件的傳播機制是指當一個事件在DOM樹中觸發時&#xff0c;它是如何在各個元素之間傳播的。DOM事件傳播機制分為三個階段&#xff1a;捕獲階段、目標階段和冒泡階段。此外&#xff0c;還有一種常用的技術稱為事件委托&#xff0c;它能夠簡化事件處理程序的綁定和管理。本文將…