类模板的目的

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

类模板的定义格式

  • 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. 项目三(集团官网)——总结(1) cookie

    最近十几天一直在忙着做集团官方网站的工作,从刚开始紧张的筹备一直到现在初步成型,今天才有时间特地来记录一下自己在这个项目中的收获. 先来说一说今天遇到的问题吧:关于cookie~ 事情起因是这样的:在 ...

  2. VSS Plugin配置FAQ(翻译)[转]

    前言(译者) 就个人的成长历程来说,刚参加工作用的是 CVS ,前前后后有接近三年的使用体验,从今年开始使用 SVN .总的来说我更喜欢 SVN ,用起来的确很方便,例如在本地源代码文件中加一个空格然 ...

  3. PHP/MYSQL 查询大数据/遍历表

    PHP:PHP 5.3.6 (cli) (built: Jun 15 2011 16:29:50) MYSQL:5.1.51 如果我们有的一张表有几百万或几千万的记录,我们要使用 PHP 将所有的记录 ...

  4. Windows内核对象

    1. 内核对象 Windows中每个内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核进行访问,应用程序不能在内存中定位这些数据结构并直接更改其内容.这个内存块是一个数据结构,其成员 ...

  5. ASCII转义字符

    转义字符 意义 ASCII码值(十进制) \a 响铃(BEL) 007 \b 退格(BS) 008 \f 换页(FF) 012 \n 换行(LF) 010 \r 回车(CR) 013 \t 水平制表( ...

  6. 使用ContentProContentProvider共享生词本数据

    自定义ContentProvider需要在项目清单中注册: import android.content.ContentProvider;import android.content.ContentU ...

  7. [css]邮件的写法

    <style type="text/css">        /* Client-specific Styles */        #outlook a{paddin ...

  8. Dictionary解析json,里面的数组放进list,并绑定到DataGridView指定列

    Dictionary解析json,1.根据json建立相应的实体类,json里面的数组形式放进list集合2.取list中的数据,将相应的数据绑定到DataGridView,如下:循环(动态添加一行数 ...

  9. for循环往Oracle中插入n条数据,主键自增

    1.主键自增实现方法:http://www.cnblogs.com/Donnnnnn/p/5959871.html 2.for循环往Oracle中插入n条数据 BEGIN .. loop insert ...

  10. ODI 12.1.3发布,提升支持大数据的能力

    此次发布的ODI新版本,目的是更好的支持当前市场上的大数据平台. 大数据基因在不改变ODI工作效率的情况下,ODI增加了越来越多的数据源集成能力.ODI是在Oracle平台上标准的E-LT工具,事实上 ...