类模板

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

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

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

类模板的定义
Pair类模板:

template <class T1, class T2>
class Pair{
public:
  T1 key; //关键字
  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;//不需要改变 < 两侧变量的值所以使用const
  //Pair的成员函数 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 不可以相互赋值
函数模版作为类模板成员
#include <iostream>
using namespace std;
template <class T>
class A{
public:
template<class T2>
void Func(T2 t) { cout << t; } //成员函数模板
};
int main(){
   A<int> a;
  a.Func('K'); //成员函数模板 Func被实例化
  return 0;
}

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

类模板与非类型参数

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

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>完全是两个类
这两个类的对象之间不能互相赋值

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

(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;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,500评论 1 51
  • 注意:本文中代码均使用 Qt 开发编译环境,如有疑问和建议欢迎随时留言。 模板是 C++ 支持参数化程序设计的工具...
    赵者也阅读 5,591评论 1 5
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,849评论 6 13
  • C++文件 例:从文件income. in中读入收入直到文件结束,并将收入和税金输出到文件tax. out。 检查...
    SeanC52111阅读 2,751评论 0 3
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,559评论 18 399