类模板

类模板
• 在定义类的时候给它一个/多个参数
• 这个/些参数表示不同的数据类型
在调用类模板时, 指定参数, 由编译系统根据参数提供的数据类型自动产生相应的模板类

用类模板定义对象的写法如下:
类模板名 <真实类型参数表> 对象名(构造函数实际参数表);
如果类模板有无参构造函数, 那么也可以只写:
类模板名 <真实类型参数表> 对象名;

类模板里的成员函数, 如在类模板外面定义时,
template <型参数表>
返回值类型 类模板名<类型参数名列表>::成员函数名(参数表)
{
……
}

类模板的定义
Pair类模板:

template 
class Pair{
public:
  T1 key; //关键字
  T2 value; //值
  Pair(T1 k,T2 v):key(k),value(v) { };
  bool operator < (const Pair & p) const;
};
template
  bool Pair::operator<( const Pair & p) const;//不需要改变 < 两侧变量的值所以使用const
  //Pair的成员函数 operator <
{ return key < p.key; }

//Pair类模板的使用:
int main()
{
Pair student("Tom",19);
 //实例化出一个模板类 Pair
cout << student.key << " " << student.value;
return 0;
}

类模板的实例化=>模板类=>模板类的实例化=>对象

类模板的实例化:将T化为具体的String int

同一个类模板的两个模板类是不兼容的
Pair * p;
Pair a;
p = & a; //wrong 不可以相互赋值
函数模版作为类模板成员
#include 
using namespace std;
template 
class A{
public:
template
void Func(T2 t) { cout << t; } //成员函数模板
};
int main(){
   A a;
  a.Func('K'); //成员函数模板 Func被实例化
  return 0;
}

类模板的类型参数与函数木板的类型参数不能一致.

类模板与非类型参数

template
• 非类型参数: 用来说明类模板中的属性
• 类型参数: 用来说明类模板中的属性类型, 成员操作
的参数类型和返回值类型

template 
class CArray{
 T array[size];
public:
 void Print( )
 {
   for(int i = 0; i < size; ++i)
   cout << array[i] << endl;
 }
};

CArray a2;
CArray a3;
注意:
CArray和CArray完全是两个类
这两个类的对象之间不能互相赋值

类模板与继承
  • 类模板派生出类模板
  • 模板类 (即类模板中类型/非类型参数实例化后的类)派生出类模板
  • 普通类派生出类模板
  • 模板类派生出普通类

(1) 类模板从类模板派生

template 
class A {
  T1 v1; T2 v2;
};
template 
class B:public A {
  T1 v3; T2 v4;
};
class B:public A{ }
  int v3; double v4;
};
class A {
  double v1; int v2;
};

template 
class C:public B{
  T v5;
};
int main(){
  B obj1;
  C obj2;
  return 0;
}

(2) 类模板从模板类派生

template 
class A { T1 v1; T2 v2; };
template 
class B:public A { T v; };
int main() { 
  B obj1; 
  return 0; 
}
//自动生成两个模板类:A和B

(3) 类模板从普通类派生

class A { int v1; };
template 
class B:public A { T v; };
int main() {
  B obj1;
  return 0;
}

(4)普通类从模板类派生

template 
class A { T v1; int n; };
class B:public A { double v; };
int main() {
  B obj1;
  return 0;
}

你可能感兴趣的:(类模板)