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
}
類模板小結
- 模板是C++型別引數化的多型工具。C++提供函式模板和類模板
- 模板定義以模板說明開始。類屬引數必須在模板定義中至少出現一次。
- 同一個類屬引數可以用於多個模板。
- 類屬引數可以用於函式的引數型別、返回型別和宣告函式中的變數。
- 模板由編譯器根據實際資料型別例項化,生成可執行程式碼。例項化的函式模板稱為模板函式;例項化的類模板稱為模板類
- 函式模板可以用多種方式過載。
- 類模板可以在類層次中使用。
總結
實踐才能理解的更深刻,這裡大概有個執行的程式感覺就夠了。
附上《傳智播客掃地僧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) {