類模板
? 在定義類的時候給它一個/多個參數(shù)
? 這個/些參數(shù)表示不同的數(shù)據(jù)類型
在調(diào)用類模板時, 指定參數(shù), 由編譯系統(tǒng)根據(jù)參數(shù)提供的數(shù)據(jù)類型自動產(chǎn)生相應(yīng)的模板類
用類模板定義對象的寫法如下:
類模板名 <真實類型參數(shù)表> 對象名(構(gòu)造函數(shù)實際參數(shù)表);
如果類模板有無參構(gòu)造函數(shù), 那么也可以只寫:
類模板名 <真實類型參數(shù)表> 對象名;
類模板里的成員函數(shù), 如在類模板外面定義時,
template <型參數(shù)表>
返回值類型 類模板名<類型參數(shù)名列表>::成員函數(shù)名(參數(shù)表)
{
……
}
類模板的定義
Pair類模板:
template <class T1, class T2>
class Pair{
public:
T1 key; //關(guān)鍵字
T2 value; //值
Pair(T1 k,T2 v):key(k),value(v) { };
bool operator < (const Pair<T1,T2> & p) const;
};
template<class T1,class T2>
bool Pair<T1,T2>::operator<( const Pair<T1, T2> & p) const;//不需要改變 < 兩側(cè)變量的值所以使用const
//Pair的成員函數(shù) operator <
{ return key < p.key; }
//Pair類模板的使用:
int main()
{
Pair<string, int> student("Tom",19);
//實例化出一個模板類 Pair<string, int>
cout << student.key << " " << student.value;
return 0;
}
類模板的實例化=>模板類=>模板類的實例化=>對象
類模板的實例化:將T化為具體的String int
同一個類模板的兩個模板類是不兼容的
Pair<string, int> * p;
Pair<string, double> a;
p = & a; //wrong 不可以相互賦值
函數(shù)模版作為類模板成員
#include <iostream>
using namespace std;
template <class T>
class A{
public:
template<class T2>
void Func(T2 t) { cout << t; } //成員函數(shù)模板
};
int main(){
A<int> a;
a.Func('K'); //成員函數(shù)模板 Func被實例化
return 0;
}
類模板的類型參數(shù)與函數(shù)木板的類型參數(shù)不能一致.
類模板與非類型參數(shù)
template <class T, int elementsNumber>
? 非類型參數(shù): 用來說明類模板中的屬性
? 類型參數(shù): 用來說明類模板中的屬性類型, 成員操作
的參數(shù)類型和返回值類型
template <class T, int size>
class CArray{
T array[size];
public:
void Print( )
{
for(int i = 0; i < size; ++i)
cout << array[i] << endl;
}
};
CArray<double, 40> a2;
CArray<int, 50> a3;
注意:
CArray<int,40>和CArray<int,50>完全是兩個類
這兩個類的對象之間不能互相賦值
類模板與繼承
- 類模板派生出類模板
- 模板類 (即類模板中類型/非類型參數(shù)實例化后的類)派生出類模板
- 普通類派生出類模板
- 模板類派生出普通類
(1) 類模板從類模板派生
template <class T1, class T2>
class A {
T1 v1; T2 v2;
};
template <class T1, class T2>
class B:public A<T2,T1> {
T1 v3; T2 v4;
};
class B<int, double>:public A<double, int>{ }
int v3; double v4;
};
class A<double, int> {
double v1; int v2;
};
template <class T>
class C:public B<T,T>{
T v5;
};
int main(){
B<int, double> obj1;
C<int> obj2;
return 0;
}
(2) 類模板從模板類派生
template <class T1, class T2>
class A { T1 v1; T2 v2; };
template <class T>
class B:public A<int, double> { T v; };
int main() {
B<char> obj1;
return 0;
}
//自動生成兩個模板類:A<int, double>和B<char>
(3) 類模板從普通類派生
class A { int v1; };
template <class T>
class B:public A { T v; };
int main() {
B<char> obj1;
return 0;
}
(4)普通類從模板類派生
template <class T>
class A { T v1; int n; };
class B:public A<int> { double v; };
int main() {
B obj1;
return 0;
}