C++进阶(二)
类模版(泛型编程)
为什么需要类模版?
类模版由模版说明和类说明构成
template <类型形式参数表>
类声明
例如:
template< typename Type>
class TClass
{ // TClass 的成员函数
private:
Type DateMember;
};
- 类模版使用实现类所需要数据的类型参数化
- 类模版在表示如数组、表、图等数据结构显得特别重要,这些数据结构的表示和算法不受包含的元素类型的影响
单个模版语法
//类的类型参数化,抽象的类
//单个类模版
template<typename T>
class A
{
public:
A(T t)
{
this->t = t;
};
T &getT()
{
return t;
}
public :
T t;
}
void main()
{
// 模版中如歌使用了构造函数,则遵守以前的类的构造函数的调用规则
A<int> a(100);
a.getT();
return;
}
模版类是抽象的,需要进行类型具体
模版类本事就是类型化的 ----> 具体类 -----> 定义具体的变量
- 继承中的类模版语法
从类模版A中派生普通类B
template<typename T>
class A
{
public :
A(T x);
};
class B : public A <int>
{
public:
B(int a) : A<int> (a);
};
// 结论:子类从模版类继承的时候,需要让编译器知道,
// 父类的数据类型具体是什么
//(数据类型的本质:固定大小内存块的别名)A<int>
子模版类派生时,需要具体化模版类,C++编译器需要知道父类的数据类型具体是什么样子-----> 要知道父类所占的内存大小是多少,只有数据类型固定下来,才知道如何分配内存
- 模版类派生模版类
template < typename T>
class C : public A<T>
{
public C(T c, T a):A<T> (a)
};
类模版中的static关键字
- 从类模版实例化的每个模版类都有自己的类模版数据成员,该模版类的所有对象共享一个static数据成员
- 和非模版类的static数据成员一样,模版类的static数据成员也应该在文件范围定义和初始化
- 每个模版类有自己的类模版的static数据成员副本