1. 程式人生 > >C++ 類模板與模板類詳解

C++ 類模板與模板類詳解

轉自:https://www.cnblogs.com/cxq0017/p/6076856.html

在C++的Template中很多地方都用到了typename與class這兩個關鍵字,有時候這兩者可以替換,那麼這兩個關鍵字是否完全一樣呢?

  事實上class用於定義類,在模板引入c++後,最初定義模板的方法為:template<class T>,這裡class關鍵字表明T是一個型別,後來為了避免class在這兩個地方的使用可能給人帶來混淆,所以引入了typename這個關鍵字,它的作用同class一樣表明後面的符號為一個型別,這樣在定義模板的時候可以使用下面的方式了:

  template<typename T>.在模板定義語法中關鍵字class與typename的作用完全一樣

區分類模板與模板類的概念

  一個類模板(類生成類)允許使用者為類定義個一種模式,使得類中的某些資料成員、預設成員函式的引數,某些成員函式的返回值,能夠取任意型別(包括系統預定義的和使用者自定義的)。

  如果一個類中的資料成員的資料型別不能確定,或者是某個成員函式的引數或返回值的型別不能確定,就必須將此類宣告為模板,它的存在不是代表一個具體的、實際的類,而是代表一類類。

  類模板定義:

定義一個類模板,一般有兩方面的內容:

A。首先要定義一個類,其格式為:

template<class T>

class test

{

....

}

test為類名,在類定義體中,如果採用通用資料型別的成員,函式引數的前面需加上T,其中通用型別T可以作為普通成員變數的型別。還可以作為成員函式的引數和返回型別等。

例如:

複製程式碼
 1 template<class T>
 2 
 3 class Test
 4 {
 5 private:
 6     T n;
 7     const T i;
 8 public:
 9     Test():i(0) {}
10     Test(T k);
11     ~Test(){}
12 
13     void print();
14     T operator+(T x);
15 };
複製程式碼

如果在類外定義成員函式,若此成員函式中有模板引數存在,則除了需要和一般類的類外定義成員函式一樣的定義外,還需要在函式外進行模板宣告
例如:

1 template<class
T> 2 void Test<T>::print() 3 { 4 std::cout<<"n="<<n<<std::endl; 5 std::cout<<"i="<<i<<std::endl; 6 }
複製程式碼
1 template<class T>
2 Test<T>::Test(T k):i(k){ n=k;}
3 
4 template<class T>
5 T Test<T>::operator+(T x){
6     return n + x;
7 }
複製程式碼

關於類模板的使用:類模板的使用實際上是將類模板例項化成一個具體的類,它的格式為:類名<實際的型別>

模板類是類模板例項化後的一個產物,說個具體點的例子吧,我們把類模板比作是一個做餅乾的模子,而模板類就是用這個模子做出來的餅乾,至於這個餅乾是什麼味道的就要看你自己在例項化時用的是什麼材料了,你可以做巧克力餅乾,也可以做牛奶餅乾,這些餅乾出了材料不一樣外,其它的東西都是一樣的了。

相關推薦

iOS 的抽象和繼承:工廠模式~

//聯絡人:石虎  QQ: 1224614774暱稱:嗡嘛呢叭咪哄 一、Objective-C類族和工廠模式 /**        連結http://blog.csdn.net/sh

Java8中Optional定義使用方法

概述 到目前為止,著名的NullPointerException是導致Java應用程式失敗的最常見原因。過去,為了解決空指標異常,Google公司著名的Guava專案引入了Optional類,Guava通過使用檢查空值的方式來防止程式碼汙染,它鼓勵程式設計師寫更乾淨的程式碼。受到Goo

C++靜態庫動態庫使用

這次分享的宗旨是——讓大家學會建立與使用靜態庫、動態庫,知道靜態庫與動態庫的區別,知道使用的時候如何選擇。這裡不深入介紹靜態庫、動態庫的底層格式,記憶體佈局等,有興趣的同學,推薦一本書《程式設計師的自我修養——連結、裝載與庫》。 什麼是庫 庫是寫好的現有的,成熟的,可以複用的程式碼。現實中每個程式都要依

深入C#中getset的

釋一:屬性的訪問器包含與獲取(讀取或計算)或設定(寫)屬性有關的可執行語句。訪問器宣告可以包含 get 訪問器或 set 訪問器,或者兩者均包含。宣告採用下列形式之一: get {} set {}get 訪問器get 訪問器體與方法體相似。它必須返回屬性型別的值。執行 ge

C++學習之路(47)---C++模板模板深入

1、在c++的Template中很多地方都用到了typename與class這兩個關鍵字,而且有時候二者可以替換,那麼是不是這兩個關鍵字完全一樣呢? 事實上class用於定義類,在模板引入c++後,最初定義模板的方法為:template<class T>,這裡cl

c++模板學習-模板模板-2

c++模板學習 https://blog.csdn.net/u010029439/article/details/84977348   資料來源: https://www.cnblogs.com/cxq0017/p/6076856.html   在C++的

C++ 模板模板

轉自:https://www.cnblogs.com/cxq0017/p/6076856.html在C++的Template中很多地方都用到了typename與class這兩個關鍵字,有時候這兩者可以替換,那麼這兩個關鍵字是否完全一樣呢?  事實上class用於定義類,在模板

C++模板的特化(函式模版特殊,模版特化)

模版與特化的概念 函式模版與類模版 C++中模板分為函式模板和類模板 函式模板:是一種抽象函式定義,它代表一類同構函式。 類模板:是一種更高層次的抽象的類定義。 特化的概念 所謂特化,就是將泛型的東東搞得具體化一些,從字面上

C/C++ 指標陣列陣列指標、函式指標指標函式、模板函式函式模板模板模板區別

函式模板與模板函式、模板類與類模板區別: 在C++中有好幾個這樣的術語很重要: 函式指標——指標函式陣列指標——指標陣列類模板——模板類函式模板——模板函式  1.函式指標——指標函式     函式指標的重點是指標。表示的是一個指標,它指向的是一個函式,例子:   int

“全棧2019”Java第五十九章:抽象抽象方法

難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第五十九章:抽象類與抽象方法詳解 下一章 “全棧2019”Java第六十章:如何定義介面

NodeJS_08_art-template子模板模板繼承_MongoBooster_express-session_三大中介軟體_全域性錯誤處理

NodeJS七天課程學習筆記_第8天 Blog綜合案例Blog 綜合案例 (包含註冊、登入、修改密碼、登出、釋出、分頁列表、評論、個人中心、上傳頭像等)課程內容概要:    1. 介紹art-template中的 子模板 與 模板繼承    2. 介紹表單同步提交與非同步提交

Android Studio自定義萬能註釋模板建立,方法註釋模板

程式碼的註釋是我們平時必須面對的問題,今天我們就來看看如何自定義屬於自己的註釋模板。提高我們的開發效率。 這裡,我們講解兩種自定義模板。 1.新建的類自動生成的註釋; 2.自定義註釋模板。 新建類自動生成的註釋 1.開啟相應的設定: Fi

C++中拷貝建構函式

a. C++標準中提到“The default constructor, copy constructor and copy assignment operator, and destructor are special member functions.[Note: T

區分類模板模板的概念

在C++的Template中很多地方都用到了typename與class這兩個關鍵字,有時候這兩者可以替換,那麼這兩個關鍵字是否完全一樣呢?  事實上class用於定義類,在模板引入c++後,最初定義模板的方法為:template<class T>,這裡class

C++中空佔一位元組原因

C++中空類佔位問題     在C++中空類會佔一個位元組,這是為了讓物件的例項能夠相互區別。具體來說,空類同樣可以被例項化,並且每個例項在記憶體中都有獨一無二的地址,因此,編譯器會給空類隱含加上一個

python介面自動化(三十六)-封裝呼叫--流程介面關聯續集(

簡介    上一篇已經給大家都介紹過了流程類介面關聯,但是由於部落格的登入機制改變,所以沒有辦法給小夥伴們實戰演練一下,那麼這篇就按照上一篇計劃的用jenkins來給小夥伴們演示一下流程類介面的封裝和呼叫,其實很簡單,就是用上一篇和前邊這篇傳送門的程式碼稍 稍修改即可。不知道你自己練習了麼,如果

C# 接口抽象

虛方法 聲明 bsp 抽象類 抽象 類繼承 strac 應該 str (1)抽象類使用abstract關鍵字進行定義,接口使用interface關鍵字定義,他們都不能進行實例化。 (2)抽象類中可以包含虛方法、非抽象方法、靜態成員;接口中不能包括虛方法、任何靜態成員 並

使用Java的Graphics進行繪圖的方法

範圍 date cnblogs 兩種 size set orm 畫橢圓 true Graphics類提供基本繪圖方法,Graphics2D類提供更強大的繪圖能力。本節講解Graphics類,下節講解Graphics2D。 Graphics類提供基本的幾何圖形繪制方法,主要有

C++中繼承抽象

post dog urn 針對 delet rtu 繼承 prot virt 繼承語法格式如下: class 子類名稱 : 繼承方式(public private protected 三種) 父類名稱 純虛函數格式: virtual 返回值類型 函數名(參數列表)= 0;含

flask中jinjia2模板引擎的使用3

編程語言 Python 接上文模板繼承 Jinji2中的模板繼承是jinjia2比較強大的功能之一。模板繼承可以定義一個父級公共的模板,把同一類的模板框架定義出來共享。這樣做一方面可以提取共享代碼,減少代碼冗余和重復的工作量另一方面,對於後期的維護和管理也非常方便。一個根模板(或叫基模板)主要有三部分