關(guān)鍵詞:類模板
0.問題:在C++中是否能夠?qū)⒎盒偷乃枷霊?yīng)用與類?
類模板
1. 類模板
- 一些類主要用于存儲(chǔ)和組織數(shù)據(jù)元素
- 類中數(shù)據(jù)組織的方式和數(shù)據(jù)元素的具體類型無關(guān)
- 如:數(shù)組類,鏈表類浇辜,Stack類飘弧,Queue類末秃,等
C++ 將模板的思想應(yīng)用于類玄坦,使得類的實(shí)現(xiàn)不關(guān)注數(shù)據(jù)元素的具體類型浸赫,而只關(guān)注類所需要實(shí)現(xiàn)的功能夸政。
2. C++中的類模板
作用:以相同的的方式處理不同的類型
語法規(guī)則:在類聲明前使用template
進(jìn)行標(biāo)識元旬,<typename T>
用于說明類中使用的泛型類型T
template < typename T >
class Operator
{
public:
T op(T a, T b);
};
應(yīng)用:只能顯示指定具體類型,無法自動(dòng)推導(dǎo)守问,使用具體類型<type>定義對象
Operator<int> op1;
Operator<string> op2;
int i = op1.op(1, 2);
string s = op2.op("abc", "def");
3. 編譯器對類模板的處理方式
聲明的泛指類型T可以出現(xiàn)在類模板的任意地方匀归,作為一個(gè)合法的類型來使用
編譯器對類模板的處理方式和函數(shù)模板相同:
(1) 從類模板通過具體類型產(chǎn)生不同的類
(2) 在聲明的地方對類模板代碼本身進(jìn)行編譯
(3) 在使用的地方對參數(shù)替換后的代碼進(jìn)行編譯
編程說明:類模板初探
#include <iostream>
#include <string>
using namespace std;
template < typename T >
class Operator
{
public:
T add(T a, T b)
{
return a + b;
}
T minus(T a, T b)
{
return a - b;
}
T multiply(T a, T b)
{
return a * b;
}
T divide(T a, T b)
{
return a / b;
}
};
string operator -(string& l, string& r)
{
return "string_minus";
}
int main()
{
Operator<int> op1;
Operator<string> op2;
cout << op1.add(1, 2) << endl;
cout << op2.add("abc", "def") << endl;
cout << op2.minus("abc", "def") << endl;
}
輸出結(jié)果:
3
abcdef
string_minus
4. 類模板的工程應(yīng)用
- 類模板必須在頭文件中定義
- 類模板不能分開實(shí)現(xiàn)在不同的文件中
- 類模板外部定義的成員函數(shù)需要加上模板<>聲明
編程說明:模板類的工程應(yīng)用
Operator.h
#ifndef _OPERATOR_H
#define _OPERATOR_H
template < typename T >
class Operator
{
public:
T add(T a, T b);
T minus(T a, T b);
T multiply(T a, T b);
T divide(T a, T b);
};
template < typename T >
T Operator<T>::add(T a, T b)
{
return a + b;
}
template < typename T >
T Operator<T>::minus(T a, T b)
{
return a - b;
}
template < typename T >
T Operator<T>::multiply(T a, T b)
{
return a * b;
}
template < typename T >
T Operator<T>::divide(T a, T b)
{
return a / b;
}
#endif
main.cpp
#include <iostream>
#include <string>
#include "Operator.h"
using namespace std;
int main()
{
Operator<int> op1;
Operator<string> op2;
cout << op1.add(1, 2) << endl;
cout << op2.add("abc", "def") << endl;
}
輸出結(jié)果
3
abcdef
5. 小結(jié)
- 泛型編程的思想可以應(yīng)用于類
- 類模板以相同的方式處理不同類型的數(shù)據(jù)
- 類模板非常適用于編寫數(shù)據(jù)結(jié)構(gòu)相關(guān)的代碼
- 類模板在使用時(shí)只能顯示指定類型