1. 程式人生 > >C++泛型程式設計學習(三)——類模板

C++泛型程式設計學習(三)——類模板

目錄

前言

C++泛型程式設計學習(二)——類模板中已經介紹瞭如何在一個檔案中,把類模板的方法和實現分開,這裡主要記錄下類模板的宣告和定義分別寫在標頭檔案中的方法。

類模板例項

功能:實現一個數組模板類,完成對int、char、Teacher型別元素的管理。這時候如何在Teacher類中有指標型別,就會出現深拷貝和淺拷貝的問題。
- main.cpp

#include <iostream>
#include "MyVector.cpp"    // 模板類必須包含成".cpp",一直出現錯誤,可能和是在code block中編譯有關
#include <string.h> using namespace std; class Teacher { public: friend ostream & operator<<(ostream& out, Teacher &t); Teacher& operator=(const Teacher& obj) { if(m_p != NULL) { delete[] m_p; m_p = NULL; age = 33
; } m_p = new char[strlen(obj.m_p)+1]; strcpy(m_p, obj.m_p); age = obj.age; return *this; } public: Teacher() { age = 33; m_p = new char[1]; strcpy(m_p, ""); } // 在建構函式中,對Teacher的指標變數分配記憶體 Teacher(char* name, int
age) { this->age = age; // strcpy(this->name, name); m_p = new char[strlen(name)]; strcpy(m_p, name); } Teacher(const Teacher& obj) { m_p = new char[strlen(obj.m_p)+1]; strcpy(m_p, obj.m_p); age = obj.age; } ~Teacher() { if(m_p != NULL) { delete[] m_p; // m_p = NULL; } } void printT() { cout << "name:" << m_p << " " << "age:" << age << endl; // cout << "name:" << name << endl; // cout << "age:" << age << endl; } protected: private: int age; // char name[32]; char* m_p; }; ostream & operator<<(ostream& out, Teacher &t) { out << t.m_p << " " << "age=" << t.age << endl; return out; } int main() { Teacher t1("t1", 31), t2("t2", 32), t3("t3", 33), t4("t4", 34); myVector<Teacher*> tArray(4); tArray[0] = &t1; tArray[1] = &t2; tArray[2] = &t3; tArray[3] = &t4; for(int i=0; i<4; i++) { Teacher *tmp = tArray[i]; tmp->printT(); } return 0; }
  • MyVector.h
#ifndef MYVECTOR_H
#define MYVECTOR_H

#include <iostream>

using namespace std;

template <typename T>
class myVector
{
//    friend ostream& operator<< <T>(ostream &out, const myVector &obj);
public:
    myVector(int size=0);
    myVector(const myVector &obj);  // 拷貝建構函式
    virtual ~myVector();    // 解構函式

    T& operator[](int index);
    myVector &operator=(myVector &obj);
    int getLen()
    {
        return m_len;
    }
protected:
    int m_len;
    T *m_space;
private:

};

#endif // MYVECTOR_H
  • MyVector.cpp
#include "MyVector.h"

#include <iostream>

using namespace std;

//在本編譯器中使用友元失敗
//template <typename T>
//ostream & operator<<(ostream &out, const myVector<T> &obj)
//{
//    for(int i=0; i<obj.m_len; i++)
//    {
//        out << obj.m_space[i] << " ";
//    }
//    return out;
//}

template <typename T>
myVector<T>::myVector(int size)
{
    m_space = new T[size];
    m_len = size;
}

template <typename T>
myVector<T>::~myVector()
{
    if(m_space != NULL)
    {
        delete [] m_space;
        m_space = NULL;
        m_len = 0;
    }
}

template <typename T>
myVector<T>::myVector(const myVector &obj)
{
    // 根據myV1的大小分配記憶體
    m_len = obj.m_len;
    m_space = new T[m_len];
    for(int i=0; i<obj.m_len; i++)
    {
        m_space[i] = obj.m_space[i];
    }
}

template <typename T>
T& myVector<T>::operator[](int index)
{
    return m_space[index];
}

// a3 = a2 = a1
template <typename T>
myVector<T> & myVector<T>::operator=(myVector<T> &obj)
{
    // 先把a2的舊的記憶體釋放掉
    if(m_space != NULL)
    {
        delete [] m_space;
        m_space = NULL;
        m_len = 0;
    }

    // 根據a1分配記憶體,拷貝資料
    m_len = obj.m_len;
    m_space = new T[m_len];
    for(int i=0; i<obj.m_len; i++)
    {
        m_space[i] = obj.m_space[i];
    }

    return *this;   // a2=a1
}

類模板小結

  1. 模板是C++型別引數化的多型工具。C++提供函式模板和類模板
  2. 模板定義以模板說明開始。類屬引數必須在模板定義中至少出現一次。
  3. 同一個類屬引數可以用於多個模板。
  4. 類屬引數可以用於函式的引數型別、返回型別和宣告函式中的變數。
  5. 模板由編譯器根據實際資料型別例項化,生成可執行程式碼。例項化的函式模板稱為模板函式;例項化的類模板稱為模板類
  6. 函式模板可以用多種方式過載。
  7. 類模板可以在類層次中使用。

總結

實踐才能理解的更深刻,這裡大概有個執行的程式感覺就夠了。
附上《傳智播客掃地僧c++基礎和進階課堂講義.docx》下載地址

相關推薦

C++程式設計學習()——模板

目錄 目錄 前言 類模板例項 類模板小結 總結 前言 C++泛型程式設計學習(二)——類模板中已經介紹瞭如何在一個檔案中,把類模板的方法和實現分開,這裡主要記錄下類模板的宣告和定義分別寫在標頭檔案中的方法。 類模板例項 功能:實現一

C++程式設計:函式模板模板

泛型程式設計是一種語言機制,通過他可以實現一個標準的容器庫,可以處理不同的資料型別. 比如對棧的描述: class stack { push(引數型別)//入棧 pop(引數型別)//出棧 } 由於上面的程式碼與資料型別有關,可以通過模板實現一個程式碼處理不同的資料型別。 首先執行一種通

effective C++筆記--模板程式設計

文章目錄 請使用traits classes表現型別資訊 認識模板超程式設計 請使用traits classes表現型別資訊 . traits並不是C++的關鍵字或是預先定義好的構件,它們是一種技術,也是一個C++程式設計師共同遵守的協議

C++Primer_Chap16_模板程式設計_List03_過載和模板_筆記

  函式模板可以被另一個模板或普通非模板函式過載。與往常一樣,名字相同的函式必須具有不同數量和型別的引數。涉及函式模板,函式匹配規則會在以下幾方面受到影響: 對於一個呼叫,其候選函式包括所有模板實參推斷成功的函式模板例項 候選的函式模板總是可行的,因為模板實參推斷會排除任何

C++Primer_Chap16_模板程式設計_List04_可變引數模板_筆記

  一個可變引數模板(variable template)就是一個接受可變數目引數的模板函式或模板類。可變數目的引數被稱為引數包(parameter packet)。存在兩種引數寶: 模板引數包(template parameter packet),表示0個或多個模板引數

C#入門學習集合、方法、約束、委託

本章閱讀列表 泛型很難理解?不然 泛型集合和ArrayList的裝箱拆箱 常見的泛型型別 泛型類和泛型方法 泛型約束 泛型委託 泛型很難理解?不然 在接觸的一個新的概念的時候,總會感覺難以理解,當你掌握並能熟練地使用的時候,發現這個概念其實簡單的,我相信

C++程式設計 快速排序的函式模板實現

說在前面的廢話 話說快一年沒寫過部落格了。。。 在建站之前就先用csdn寫吧 這次要說的東西也沒有啥,主要是想寫一次快排(學了這麼就快排都沒寫過你敢信 用法類似於stl裡面的sort,有兩個版本。 不知道為什麼寫了很長時間。。。這麼短的程式碼 還是感

關於C++程式設計模板宣告和定義最好在同一個檔案的解釋。

關於C++泛型程式設計 模板的 宣告和實現 不能分離的原因: 1.泛型-模板 template 2.模板不是變數,模板就是模板。 3.模板需要例項化成類,就像是行內函數進行替換一樣,替換模板變數 template<typename  T> 4.編譯過程     

C++ 程序設計與STL模板庫(1)---程序設計簡介及STL簡介與結構

urn 向上 隊列 是把 鏈表 需要 input stack 特定 泛型程序設計的基本概念 編寫不依賴於具體數據類型的程序 將算法從特定的數據結構中抽象出來,成為通用的 C++的模板為泛型程序設計奠定了關鍵的基礎 術語:概念 用來界定具備一定功能的數據類型。例如:

c++ 程式設計

C++ 泛型程式設計與STL模板庫(1)---泛型程式設計簡介及STL簡介與結構 泛型程式設計的基本概念 編寫不依賴於具體資料型別的程式 將演算法從特定的資料結構中抽象出來,成為通用的 C++的模板為泛型程式設計奠定了關鍵的基礎 術語:概念 用來界定具備一

C++ 演算法學習筆記(equal, accumulate, back_iterator, pair)

equal equal是區間比較演算法 原型為: template <class _InputIterator1, class _InputIterator2> inline _LIBCPP_INLINE_VISIBILITY bool equal(_InputIt

程式設計學習,編寫一個類似STL庫中的簡易list的迭代器(iterator)

泛型程式設計學習,編寫一個類似STL庫中的簡易list的迭代器(iterator) 前言 近期在研究stl原始碼及stl裡各種實現的細節,初學入門免不了模仿,以下便寫一次自己的簡單的list容器的迭代器。 首先,在開始編寫List的迭代器的時候我們首先應該瞭解我們要寫的List和其迭

C++程式設計

面向物件程式設計關注資料,泛型程式設計關注演算法。 模板和迭代器:都是STL通用方法的組成部分,模板讓演算法獨立於資料型別,迭代器讓演算法獨立於容器型別。例如,對於在陣列和在連結串列中查詢特定值節點的find函式,模板提供了儲存在容器中的資料型別的通用表示,還需要提供遍歷容

C/C++ 程式設計vector(排序)

題目描述 對一組輸入的資料(0結束)進行排序輸出。 約定:所有的輸入資料都為正整數,且都不大於100000。 輸入 包括多組測試資料。 每組以0結尾。 輸出  每組輸出1行。輸出排序後的資料(不含0)。 樣例輸入 1 2 3 2 4 0 5 6 2 2 0

C/C++ 程式設計stack(括號匹配)

題目描述 假設表示式中包含一種括號:圓括號,其巢狀順序隨意,即(()())或(())等為正確的格式,)(或((())或())均為不正確的格式。檢驗括號是否匹配可以用堆疊來實現當遇到 ( 時進棧,遇到 ) 時出棧進行匹配檢驗,如果出現不匹配的情況立即結束,否則繼續取下一個字元

C++ 程式設計(單詞數)

題目描述 lily的好朋友xiaoou333最近很空,他想了一件沒有什麼意義的事情,就是統計一篇文章裡不同單詞的總數。下面你的任務是幫助xiaoou333解決這個問題。 輸入 有多組資料,每組一行,每組就是一篇小文章。每篇小文章都是由小寫字母和空格組成,沒有標點符號,每

C++ 程式設計(國名排序)

題目描述 問題描述:小李在準備明天的廣交會,明天有來自世界各國的客房跟他們談生意,小李要儘快的整理出名單給經理,你能幫他把客戶來自的國家按英文字典次序排好嗎? 例如小李手上有來自加拿大,美國,中國的名單,排好的名單應是美國,加拿大,中國 。 輸入 第1行為一個n(n&

[C++]程式設計的基礎問題

例如有一個 min 函式,我們希望它相對型別是獨立的,也就是說任何類/型別都可以呼叫這個函式。如果是一個整型的數,通常我們可以這樣寫: int min(const int & a,const int &b) { return a<b?a:b; } 為了讓它適用於多個類,我們知

C++ 程式設計vector(成績排序)

題目描述 定義學生結構體,包括學號、及三門功課的成績和總分,按照總分從小到大輸出學生學號、總分和各門功課的成績。如果總分相同,就按第1門課的分數小到大輸出;如果第1門課的分數相同,就按第2門課的分數小到大輸出; 輸入 輸入包含n(n<20)個學生的資訊, 第1行學

[轉]C#程式設計

 泛型:通過引數化型別來實現在同一份程式碼上操作多種資料型別。利用“引數化型別”將型別抽象化,從而實現靈活的複用。 例子程式碼: class Program     {         static void Main(string[] args)         {