类模板的目的

  • 设计通用的类型式,以适应广泛的成员数据型式

类模板的定义格式

  • template<模板形式参数列表>class 类名称{...};
  • 原型:template<typename T> class A;

类模板的成员

  • 像普通类的成员一样定义
  • 定义在类中或类外均可,后者需要在类名后列些模板参数,以区别非模板类的成员函数
  • template<typename T> T A<T>::f(u)

类成员函数的模板

  • 成员函数可以使用其他模板
template<typename T>class A
{
public:
template<typename U> T f(const U &u);
};
template<typename T> template<typename U>
T A<T>::f(const U &u)
{ }

类模板

类模板的体化

  • 与函数模板不同,类模板体化时必须给定模板的实际参数,例如:A<T> a;
  • 类模板体化时,编译器生成模板类或者成员函数的代码;成员函数在调用时体化,虚函数在类构造时体化

类模板的显式体化

  • template class A<int>;
  • 解决模板库的创建问题,库的使用者可能没有体化的机会,而未体化的模板定义不会出现在目标文件中
  • 显式体化类模板后,显式体化其构造函数
  • 其他成员函数可显式体化,也可不显式体化

类模板的显式特化

  • 使用特定的型或值显式特化类模板,以定制类模板代码,如:template<> class A<char>{...};
  • 显式特化版本覆盖体化版本
  • 显式特化并不要求与原始模板相同,特化版本可以具有不同的数据成员或成员函数
  • 类模板可以部分特化,结果仍然是类模板,以支持类模板的部分定制

类模板的缺省模板参数

  • 与函数模板相同,类模板可以具有缺省模板参数
//队列
#include <iostream>
#include <cstdlib>
//空队列异常类
class EQueueEmpty {};
//队列项类前置声明
template<typename T> class JuQueueItem;
//队列类
template<typename T> class JuQueue
{
public:
JuQueue:_head(NULL),_tail(NULL){}
virtual JuQueue();
virtual void Enter(const T &item);
virtual T Leave();
bool IsEmpty() const { return _head == ; }
private:
JuQueueItem<T> *_head, *_tail;
};
//队列项类,单项链表结构
template<typename T> class JuQueueItem
{
friend class JuQueue<T>;
public:
JuQueueItem(const T &item):_item(item),_next(){}
private:
T _item;
JuQueueItem<T> *_next;
};
//队列类析构函数
template<typename T> JuQueue<T>::~JuQueue()
{
while (!IsEmpty())
{
Leave();
}
}
//入队
template<typename T> void JuQueue<T>::Enter(const T &item)
{
JuQueueItem<T> *p = new JuQueueItem<T>(item);
if (IsEmpty())
_head = _tail = p;
else
_tail->_next = p, _tail = p;
} //出列
template<typename T> T JuQueue<T>::Leave()
{
if (IsEmpty())
throw EQueueEmpty();
JuQueueItem<T> *p = _head;
T _retval = p->_item;
_head = _head->_next;
delete p;
return _retval;
} int main()
{
JuQueue<int> *p = new JuQueue<int>;
for (int i = ; i < ; i++)
{
p->Enter(i);
}
std::cout << p->Leave() << std::endl; int *r = new int(), *p = new int();
JuQueue<int*>*t = new JuQueue<int*>;
t->Enter(r);
t->Enter(q);
int *s = t->Leave();
std::cout << *s << std::endl; return ;
}

C++学习笔记36:类模板的更多相关文章

  1. C++学习笔记(3)----类模板的static成员

    与任何其他类相同,类模板可以声明 static 成员: template <typename T> class Foo { public: static std::size_t count ...

  2. C++学习笔记(2)----类模板和友元

    当一个类包含一个友元声明时,类与友元各自是否是模板是相互无关的.如果一个类模板包含一个非模板友元,则友元被授权可以访问所有模板实例.如果友元自身是模板,类可以授权给所有友元模板实例,也可以只授权给特定 ...

  3. C++学习笔记36 (模板的细节明确template specialization)和显式实例(template instantiation)

    C++有时模板很可能无法处理某些类型的. 例如: #include <iostream> using namespace std; class man{ private: string n ...

  4. Java学习笔记之---类和对象

    Java学习笔记之---类和对象 (一)类 类是一个模板,它描述一类对象的行为和状态  例如:动物类是一个类,动物们都有属性:颜色,动物们都有行为:吃饭 public class Dog { Stri ...

  5. Java学习笔记——File类之文件管理和读写操作、下载图片

    Java学习笔记——File类之文件管理和读写操作.下载图片 File类的总结: 1.文件和文件夹的创建 2.文件的读取 3.文件的写入 4.文件的复制(字符流.字节流.处理流) 5.以图片地址下载图 ...

  6. python学习笔记4_类和更抽象

    python学习笔记4_类和更抽象 一.对象 class 对象主要有三个特性,继承.封装.多态.python的核心. 1.多态.封装.继承 多态,就算不知道变量所引用的类型,还是可以操作对象,根据类型 ...

  7. 微信小程序开发:学习笔记[2]——WXML模板

    微信小程序开发:学习笔记[2]——WXML模板 快速开始 介绍 WXML 全称是 WeiXin Markup Language,是小程序框架设计的一套标签语言,结合小程序的基础组件.事件系统,可以构建 ...

  8. UML学习笔记:类图

    UML学习笔记:类图 有些问题,不去解决,就永远都是问题! 类图 类图(Class Diagrame)是描述类.接口以及它们之间关系的图,用来显示系统中各个类的静态结构. 类图包含2种元素:类.接口, ...

  9. swift学习笔记3——类、结构体、枚举

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

随机推荐

  1. Error in Android Studio - "Default Activity Not Found"

    Make sure you have specified the default activity in your AndroidManisfest.xml file. Within your def ...

  2. C#入门篇6-9:字符串操作 不值一提的函数【不看也行】

    // 判断输入的是否全是数字:返回结果:true:全是数字:false:有字幕出现 public static bool Isaccord1(string str) { bool bl = true; ...

  3. android webview 漏洞背后的节操

    by superhei 2013/09/06 [注:本文提到的都是我个人的观点,该行为也是私人行为,与任何组织.公司无关.另:水军请自重!] 一.前言   这两天,一个2+年前的android web ...

  4. Linux中如何让命令在后台运行

    1.在下达的命令后面加上&,就可以使该命令在后台进行工作,这样做最大的好处就是不怕被ctrl+c这个中断指令所中断. 2. 那大家可能又要问了,在后台执行的程序怎么使它恢复到前台来运行呢?很简 ...

  5. [windows驱动]内核态驱动架构

    1.windows驱动简介: 1.1 windows组件简介: 1.2 windows驱动类型: windows驱动分为两种基本类型: 用户态驱动在用户态下执行.它们一般提供一套win32应用程序和内 ...

  6. hadoop创建两大错误:Bad connection to FS. command aborted. exception和Shutting down NameNod...

    我的hadoop启动后,各个节点都正常,但是无法查看hdfs目录,错误提示 Bad connection to FS. command aborted.  查了下网上的解决办法,主要是删除tmp下的所 ...

  7. VMware Workstation 10.0.0.1295980 CN

    从V10版本开始,VMware Workstation 官方自带简体中文了,以后大家不需要汉化啦! Winner of more than 50 industry awards, VMware Wor ...

  8. C# IList<T>转为DataTable

    public class WebUtil { /// <summary> /// 转换IList<T>为DataTable/// </summary> /// &l ...

  9. python抓取性感尤物美女图

    由于是只用标准库,装了python3运行本代码就能下载到多多的美女图... 写出代码前面部分的时候,我意识到自己的函数设计错了,强忍继续把代码写完. 测试发现速度一般,200K左右的下载速度,也没有很 ...

  10. IIS 6.0 401 错误

    1.错误号401.1 症状:HTTP 错误 401.1 - 未经授权:访问由于凭据无效被拒绝 分析:  由于用户匿名访问使用的账号(默认是IUSR_机器名)被禁用,或者没有权限访问计算机,将造成用户无 ...