上文简述了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. apt-pkg

    1 什么是apt-pkg python的apt库,可以做apt可以做的任何事情. 2 apt_pkg.parse_depends(depends, strip_multiarch=True) 这里的d ...

  2. uwsgi 所扮演的的角色是后端 http 服务器,nginx 扮演的角色是前端 http 服务器,hello.py 是客户端应用程序

    小结: 1.nginx传递每一个请求给绑定到3031端口并使用uwsgi协议的服务: http://www.jb51.net/article/76715.htm 在本文中,uwsgi 所扮演的的角色是 ...

  3. WEB 字体

    之前如果想在自己的网站使用某些好看的字体,总是迫不得已得在PS里先把字体图片做好.虽然这样做也能达到我们想要的效果,但是这样就增加了HTTP请求 (如果在多处使用的话),即使合并所有图片,也不好管理, ...

  4. java定时器2-spring实现

    spring定时器(基于xml) spring定时器(基于注解) quartz定时器 1.使用基于xml配置的spring定时器 首先编写定时任务类Mytask public class Mytask ...

  5. YTU 2573: 连续奇数和

    2573: 连续奇数和 时间限制: 1 Sec  内存限制: 128 MB 提交: 63  解决: 37 题目描述 小明看到一本书上写着:任何数字的立方都可以表示为连续奇数的和. 比如: 2^3 = ...

  6. div+css布局教程系列1

    <!doctype html><html><head><meta charset="utf-8"><title>简单布局 ...

  7. lucene DocValues——本质是为通过docID查找某field的值 看图

    Why DocValues? The standard way that Solr builds the index is with an inverted index. This style bui ...

  8. Ubuntu Nginx uwsgi django 初试

    /************************************************************************************** * Ubuntu Ngi ...

  9. Java总结基础知识

    权限关键字: public:可以被所有其他类所访问,不同的包 protected:当前类的成员.同一个包中.不同包中对子类可见父类protected,继承类 default:同一包中的类可以访问,声明 ...

  10. 前端之html第二天

    一.内容