上文简述了C++模板中的函数模板的格式、实例、形参、重载、特化及参数推演,本文主要介绍类模板.

一、类模板格式

  类模板也是C++中模板的一种,其格式如下:

template<class 形参名1, class 形参名2, ...class 形参名n>
class 类名{
...
};

  例如:我个人模拟实现的Vector的声明

template<typename T>
class Vector{
public:
typedef T* Iterator; //迭代器
typedef const T* ConstIterator; //const类型迭代器
public:
//类的成员函数
Vector(); //构造函数
Vector(const Vector&); //拷贝构造
Vector& operator=(const Vector&); //赋值运算符重载
~Vector(); //析构函数
public:
//公共接口
void PushBack(const T &); //尾插
void PopBack(); //尾删
Iterator Find(const T &); //查找
void Insert(Iterator*); //插入
void Erase(Iterator*); //删除
void Size(); //获取有效元素个数
bool Empty(); //判断是否为空
void clear(); //清空
public:
//迭代器接口
Iterator Begin(); //迭代器起始位置
Iterator End(); //迭代器结束位置
private:
T *_start;
T *_finish;
T *_endOfStroage;
};

二、模板类的实例化

  只要有不同的类型,编译器就会实例化出一个对应的类,这点与函数模板非常相似.例如:

Vector<int> v1;
Vector<char> v2;

  当定义上述两个类型的Vector时,编译器会用int和char分别代替模板形参,重新编写Vector类,最后创建Vector<int>和Vector<char>类.

三、非类型的模板参数

  对于函数模板和类模板,模板参数并不局限于类型,普通值也可以作为模板参数。例如:

template<typename T,int SIZE=10>
class Array{
private:
T _arr[SIZE];
};

  虽然非类型模板参数很好用,但是也有一些限制:

  注意:浮点数和类对象是不允许作为非类型模板参数的.

  ***函数模板不支持形参带默认值.

四、类模板的特化

  模板的特话分为两种,全特化和偏特化.

  全特化是指,所有的模板参数都要进行特化.例如:

template<typename T>
class Vector{
public:
Vector();
~Vector();
private:
T *_start;
T *_finish;
T *_endOfStroage;
}; template<>
class Vector<int>{
public:
Vector();
~Vector();
private:
int *_start;
int *_finish;
int *_endOfStroage;
}
//不需要模板参数
Vector<int>::Vector(){
//代码
}

  从上述代码我们可以看出:特化后定义成员函数不需要加模板参数.

  偏特化,是指多个模板参数可以只特化一个或一部分.如:

template<typename T1,typename T2>
class Add{
public:
Add();
~Add();
private:
T1 _left;
T2 _right;
}; //只特化第一个参数
template<typename T2>
class Add<int,T2>{
public:
Add();
~Add();
private:
int _left;
T2 _right;
}; //特化指针类型
template<typename T1,typename T2>
class Add<T1*,T2*>{
public:
Add();
~Add();
private:
T1 _left;
T2 _right;
T1* _leftPtr;
T2* _rightPtr;
};

  我们从上述代码可以看出,偏特化具有这样的特性:

  偏特化并不仅仅局限于特化部分参数,而是对模板参数更进一步的条件限制所设定出来的一个特化版本.

  最后的说明:

  特化并不只是类模板才具有的特性,函数模板也具有特化功能,函数模板的特化与类模板类似.

【C++】模板简述(三):类模板的更多相关文章

  1. 【C++】模板简述(二):函数模板

    我们上文讲了,模板的引入,我们发现在某种特殊的情况下,必须得通过模板才能完美的解决问题. 本文就来简述一下函数模板的基本使用. 一.函数模板格式 template<typename Param1 ...

  2. C++ 类模板一(类模板的定义)

    //类模版语法 #include<iostream> using namespace std; /* 类模板和函数模板深入理解 1.编译器并不是把函数模板处理成能处理任何类型的函数 2.编 ...

  3. C++入门经典-例9.3-类模板,简单类模板

    1:使用template关键字不但可以定义函数模板,而且可以定义类模板.类模板代表一族类,它是用来描述通用数据类型或处理方法的机制,它使类中的一些数据成员和成员函数的参数或返回值可以取任意数据类型.类 ...

  4. VS自定义模板-以自定义类模板为样例

    前言 在实际的工作过程中部分公司会要求开发人员在开发过程中需遵守一些开发规范,开发规范中主要包括文件的注释规范,项目.文件.变量的命名规范(例如驼峰规范)等等.例如我们代码规范中就有一项新增文件的文件 ...

  5. C++练习 | 单向链表类模板(包含类模板中静态变量初始化格式)

    #include <iostream> #include <string> using namespace std; template <class T> clas ...

  6. 【C++】模板简述(六):总结

    1.模板技术是泛型编程的基础.([C++]模板简述(一):模板的引入) 2.模板被编译两次,因而给分离编译造成一些麻烦.([C++]模板简述(二):函数模板.[C++]模板简述(四):模板为什么不支持 ...

  7. C++类模板的三种特化

    说起C++的模板及模板特化, 相信很多人都很熟悉 ,但是说到模板特化的几种类型,相信了解的人就不是很多.我这里归纳了针对一个模板参数的类模板特化的几种类型, 一是特化为绝对类型: 二是特化为引用,指针 ...

  8. C++ 类模板基础知识

    类模板与模板类 为什么要引入类模板:类模板是对一批仅仅成员数据类型不同的类的抽象,程序员只要为这一批类所组成的整个类家族创建一个类模板,给出一套程序代码,就可以用来生成多种具体的类,(这类可以看作是类 ...

  9. 【C++】模板简述(四):模板为什么不支持分离编译?

    上文简述了类模板相关功能,本文主要简述为什么模板不支持分离编译? 在C++中,为了一个项目的规范,我们通常把代码归为三类:声明文件.实现文件.测试文件. 比如,我要用C++实现一个链表,那么就会创建这 ...

随机推荐

  1. H5的localStorage简单存储删除

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  2. (转载)synchronized代码块

    原文:http://blog.csdn.net/luoweifu/article/details/46613015 作者:luoweifu 转载请标名出处 <编程思想之多线程与多进程(1)——以 ...

  3. es的forcemerge——按照天分割

    归并线程配置 segment 归并的过程,需要先读取 segment,归并计算,再写一遍 segment,最后还要保证刷到磁盘.可以说,这是一个非常消耗磁盘 IO 和 CPU 的任务.所以,ES 提供 ...

  4. hadoop-3.0.0-alpha4安装部署过程

    关闭防火墙 #systemctl stop firewalld.service #停止firewall #systemctl disable firewalld.service #禁止firewall ...

  5. request的Content-Type小结

    一.Content-Type定义 Content-Type MediaType,即是Internet Media Type,互联网媒体类型:也叫做MIME类型,在Http协议消息头中,使用Conten ...

  6. bzoj 4753 最佳团体 —— 01分数规划+树形背包

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4753 注意赋初值为 -inf: eps 设为 1e-3 会 WA ... 代码如下: #in ...

  7. DoDataExchange的作用

    void CDlgSelectCS::DoDataExchange(CDataExchange* pDX) {     CDialog::DoDataExchange(pDX);     DDX_Te ...

  8. 关于XAMPP Apache无法启动问题解决方案

    安装好XAMPP后,启动Apache服务启动失败,然后从xampp安装目录下执行apache_start.bat文件,如下图 显示443端口被占用. 解决方法: 启动cmd,输入netstat -a  ...

  9. 【WIP】外汇与证券交易29个技术指标

    创建: 2017/05/16   更新: 2017/05/30 更新: 2017/10/14 标题加上[WIP],增加创建时间  指标名称  函数原型(prototype)  参考与分析 (refer ...

  10. FOJ2252:Yu-Gi-Oh!

    传送门 题意 略 分析 枚举合成ab的数量,在此基础上合成bc和ac,复杂度\(O(n)\) trick 代码 #include<cstdio> #include<algorithm ...