1. 程式人生 > >C++:模板類

C++:模板類

22.1 模板類

模板是泛型程式設計的基礎,那什麼是泛型程式設計呢?泛型程式設計是一種獨立於任何特定資料型別編寫程式碼的方式。

C++標準模板庫中的資料容器、迭代器和演算法,都是泛型程式設計的例子,它們都使用了模板的概念。比如動態陣列vector是可以存放任何型別資料的容器,我們可以定義許多不同型別的vector,比如 vector <int> 或 vector <string>。我們還可以定義儲存鍵值對資料的map<int,float>或map<string,int>。

在定義一個類時先不指定類中資料成員的具體型別,而是用一個通用型別 T 來暫時替代,等到例項化類的物件時才確定類的成員資料的型別,這就叫模板類。

有了模板類,編譯器會在編譯階段從類模板自動生成多個具體型別的類定義。類模板避免了程式設計師重複程式設計,但是並不等於程式中沒有具體型別類的程式碼。只要程式中有一個模板類的例項物件,就會存在對應的具體類的程式碼。

22.2 定義模板類

模板類宣告的形式如下所示:

template <class T> class class_name {

...

}

T是一個佔位符,類被例項化的時候T可以替換成某個具體的資料型別。比如下面這個例子中學生成績的資料型別有時候是用整型表示,有時候是用浮點型表示,那就可以把它定義為泛型T。

C++:模板類

<>中的泛型資料型別也可以是多個,比如<class T1, class T2>。

C++:模板類

22.3 模板類的物件

例項化一個類模板時,物件的引數表中的引數必須是具體的型別名,如 string、int 或其他類的名字。它們用來一一對應地替換類模板定義中“型別引數表”中的型別引數。

C++:模板類

22.4 模板類的派生

可以從模板類派生出新的模板類,格式如下圖所示:

C++:模板類

也從模板類派生非模板類 ,在派生中作為非模板類的基類,必須是類模板例項化後的類,並且在定義派生類前不需要模板宣告語句:template<class T>。如下圖所示:

C++:模板類

相關推薦

C++模板

22.1 模板類 模板是泛型程式設計的基礎,那什麼是泛型程式設計呢?泛型程式設計是一種獨立於任何特定資料型別編寫程式碼的方式。 C++標準模板庫中的資料容器、迭代器和演算法,都是泛型程式設計的例子,它們都使用了模板的概念。比如動態陣列vector是可以存放任何型別資料的容器,我們可以定義許多不同型別的

c++template模板問題

菜市場 感情 emp 守護 pla 只知道 呵呵 是什麽 放下 最喜歡藍色,是天空的藍色,純凈無瑕、晶瑩美好。 不知道是什麽時候開始把夢想看得這樣重要,只知道,夢想,真的、真的、真的、重要。 每個人都有值得自己守護的夢,或許很清!晰或許還沒有一個準確的定位,或許,你根本不相

C++ 中模板模板成員函數在外定義

成員函數 成員 typename 開源 splay 開源代碼 pen color play 因為很多書都沒講到這種情況, 曾經有這個問題但一直沒答案,所以我一直以為模板類的模板成員函數只能在類內定義,直到我在某個開源代碼裏看到原來要加兩個 template<>

泛型程式設計模板

#include <iostream> #include <vector> using namespace std; template<typename T> class MyStack { public: MyStack(); ~M

C#Process操控cmd命令,執行並列印

1.引入名稱空間 using System.Diagnostics; 2.程式碼如下: using System; using System.Diagnostics; using System.Windows.Forms; namespace WindowsFormsApp14 {

c++ array模板使用

目錄 本章是對c++ array模板類的知識歸納,講述了c++中array模板類的使用,不涉及原理方面的內容。 c++中的陣列型別是繼承了c語言的特性,在使用陣列的時候要注意陣列越界操作問題。為了更安全的對陣列進行操作,c+

c++通用模板(template class)定義實現詳細介紹

有時,有兩個或多個類,其功能是相同的,僅僅是資料型別不同,如下面語句聲明瞭一個類: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

C++中用模板(結點,連結串列)實現的單鏈表的合併操作!

程式碼通俗易通,如下 List.h #include<stdio.h> template <class T> class ListNode { T data; ListNode<T>* link; public:

c++中模板的使用

最近在資料結構的課程中很多周圍的同學對模板類的使用抱有很大的困惑,看也能看懂,但寫起來總是不明白…… 那就首先得知道為什麼要用模板。 假設我有一個方法 void swap(int& a,int& b) { int c = a;

C++中模板的友元過載

一個由《程式設計師面試寶典》引出的問題。 描述模板類的友元過載,用C++程式碼實現? 這實際上考察的是下面幾個問題: 1.模板類的編寫 2.模板類中友元函式的編寫 3.什麼時候會用到友元過載?答案是各種C++中的運算子。最典型的就是輸出操作符<<了。 書上給出的

C++初識和物件

類和物件 面向物件 面向物件程式設計:面向物件程式設計是一種程式設計範性,同時也是一種程式開發的方法。 物件:指的是類的例項,將物件作為程式的基本單元,將程式和資料封裝在其中,以提高軟體的重要性,靈活性和擴充套件性。 c++不是純面嚮物件語言,而是基

C++中模板map常用示例

#include <iostream> #include <map> using namespace std; int main() { /****************************************************

C++fstream中seekg()/seekp()與tellg()/tellp()的用法詳解

對輸入流操作:seekg()與tellg() 對輸出流操作:seekp()與tellp() 下面以輸入流函式為例介紹用法: seekg()是對輸入檔案定位,它有兩個引數:第一個引數是偏移量,第二個引數是基地址。 對於第一個引數,可以是正負數值,正的表示向後偏移,負的表示向

linux下C++引用模板成員,編譯出錯

C++引用模板類成員,編譯出錯,錯誤類似於-》missing 'typename' prior to dependent type name 'SeqList<Type>::referen

C++的模板定義一個萬能陣列,陣列元素型別任意,陣列大小也任意

/*用模版類實現一個萬能陣列,陣列型別可以任意給定,陣列大小可以任意給定*/ /* 函式呼叫 typeid(變數).name() 獲取變數的型別名 */ #include <iostream> using namespace std; //模版類定

C++】模板連結串列

上一篇部落格介紹了模板類順序表,此篇部落格主要是模板類連結串列的實現。 #pragma once #include<iostream> #include<string> using namespace std; template<typena

C++之模板(Template) 容器之map 及 物件副本 深/淺拷貝 等問題

例如:假若你沒有提供CFileAttribute::operator=(過載賦值操作符),那麼語句fileAttribute1 = fileAttribute2就相當於:memcpy(&fileAttribute1, &fileAttribute2, sizeof(CFileAttribut

C++ map模板使用注意

一直使用map模板類,感覺很方便也很好用,在使用的過程中,但是用了這麼久還是偶爾沒有注意到其特殊性,導致偶爾程式碼出錯 map<int,int> mapSort; mapSort[1]=8; mapSort[2]=7; int j=mapSort[0];

C++中模板使用友元模板函式

問題始於學習資料結構,自己編寫一個單鏈表,其中用到了過載輸出運算子<<,我寫的大約這樣: template <class T> class List { friend std::ostream& operator

C++List模板的使用

List的使用 在使用list必須包括標頭檔案#include <list> 如何定義一個list物件 #include <list>int main (void)  {      list<char > cList; //聲明瞭l