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数据成员副本

C++进阶(二)