C++類模板 簡單講解與實現

模板機制

模板機制使得程序員不需要關心參數的數據類型,只用專注於實現算法,將數據類型與算法抽象分離,是可以提升編碼效率的好東西。

上一篇【C++ 模板函數 講解及實現】介紹瞭如何使用函數模板來簡化編程,今天來介紹類模板

類模板介紹

類模板在實現一些數據結構的時候經常使用,因爲數據結構告訴我們不需要關心實際存儲的數據類型,而是專注於存儲的方式。

如果我們希望實現一個數組類,用來存儲int元素,我們可以很快實現

class myArray
{
public:
	int data[10];
	int len;
	myArray(){}
	int& operator [] (int index){return data[index];}	
};

可是我們發現如果我們希望存儲double元素,就得重新修改上述的類,這非常麻煩

class myArray
{
public:
	double data[10];
	int len;
	myArray(){}
	double& operator [] (int index){return data[index];}	
};

可是注意到修改的地方只有數據類型,其他的操作一律不用修改
在這裏插入圖片描述
和函數模板中的問題類似,我們希望有一種通用的定義方式,來使得類的定義變得靈活。類模板提供了這種功能的實現

類模板實現

template關鍵字

和函數模板類似,類模板同樣使用template關鍵字,用template<class TYPE>括號中的數據類型TYPE來抽象的表示類實現時的數據類型

比如實現一個可以裝載任何數據類型的數組類myArray

template<class TYPE>
class myArray
{
public:
	TYPE data[10];
	int len;
	myArray(){}
	TYPE& operator [] (int index){return data[index];}	
};

實例化

因爲模板類事先不知道template括號中的數據類型是什麼,所以在實例化一個模板類的時候,我們往往要給出對應的數據類型

比如實例化上述的myArray類,使用int作爲數據類型,只需要在尖括號中寫入對應的類型名即可(這個類型名也可以是自定義數據類型)

myArray<int> arr;

一個例子

通過模板類實現一個簡單的數組以存儲任何數據類型

#include <bits/stdc++.h>

using namespace std;

template<class TYPE>
class myArray
{
public:
	TYPE data[10];
	int len;
	myArray(){}
	TYPE& operator [] (int index){return data[index];}	
};

int main()
{ 	
	myArray<int> arr;
	arr.len = 3;
	for(int i=0; i<3; i++)
	{
		int x; cin>>x;
		arr[i] = x;
	}
	for(int i=0; i<3; i++) cout<<arr[i]<<" "; cout<<endl;
	
	return 0;
}

上述main函數中,使用int來實例化模板類,組成int數組
在這裏插入圖片描述
如果我們使用string類來實例化,就會得到存儲字符串的數組
在這裏插入圖片描述

myArray<string> arr;
	arr.len = 3;
	for(int i=0; i<3; i++)
	{
		string x; cin>>x;
		arr[i] = x;
	}
	for(int i=0; i<3; i++) cout<<arr[i]<<" "; cout<<endl;

在這裏插入圖片描述

多個類型的模板類

有時候實現一個模板類,可能會用到多個數據類型。

比如我們要實現一個【鍵值對】,鍵的數據類型爲A,對應的值的數據類型爲B,(其實就是C++的pair類模板)

template<class TYPE1, class TYPE2>
class keyValuePair
{
public:
	TYPE1 key;
	TYPE2 value;
	keyValuePair(){}
	keyValuePair(TYPE1 k, TYPE2 v){key=k; value=v;}	
	friend ostream& operator << (ostream& os, keyValuePair& p)
	{
		os<<p.key<<" - "<<p.value<<endl;
	}
};

main函數

keyValuePair<int, double> p1(123, 456.78); cout<<p1;
keyValuePair<char, string> p2('Z', "hello"); cout<<p2;
keyValuePair<int, int> p3(12345, 67890); cout<<p3;

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章