上文简述了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. mysql备份及还原

    mysql怎样复制数据库?或者说,将数据库拷贝到另外一台机? 按照我的理解,复制数据库,如果是: 1.直接拷贝数据库文件,应该先停数据服务,否则拷不出来.但是,生产机器,哪能说停就停呢? 2.在线拷贝 ...

  2. SE11 数据表中 日志数据更改 勾选的作用

        [园工]HF-abap-Rainy(574570549)  11:10:12这个有啥作用,勾上了怎么查修改日志呢,[园丁]SH-CRM-ALEX(8738890)  11:13:53SCU3[ ...

  3. UESTC 982质因子分解

    读入一个自然数,将nn分解为质因子连乘的形式输出. Input 有多组测试数据.输入的第一行是整数TT(0<T≤10000),表示测试数据的组数.每一组测试数据只有一行,包含待分解的自然数nn. ...

  4. YTU 2913: 距离产生美

    2913: 距离产生美 时间限制: 1 Sec  内存限制: 128 MB 提交: 152  解决: 133 题目描述 小明和静静是大学同学,毕业后要去两个不同的城市工作.小明要静静做他的女朋友,静静 ...

  5. 织梦DEDE系统跨站跨数据库调用数据显示

    调用方法 本标签的调用格式为: {dede:sql sql="一条完整的SQL语句" appname="数据库配置参数"}您的底层模板{/dede:sql} 稍 ...

  6. Avoiding memory leaks

    Android applications are, at least on the T-Mobile G1, limited to 16 MB of heap. It's both a lot of ...

  7. Masonry整体动画更新约束

    前言 说到iOS自动布局,有很多的解决办法.有的人使用xib/storyboard自动布局,也有人使用frame来适配.对于前者,笔者并不喜欢,也不支持.对于后者,更是麻烦,到处计算高度.宽度等,千万 ...

  8. 二:多线程--GCD

    一.简单介绍 1.GCD全称是Grand Central Dispatch,可译为“牛逼的中枢调度器”,纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方 ...

  9. Ural 2003: Simple Magic(数论&思维)

    Do you think that magic is simple? That some hand-waving and muttering incomprehensible blubber is e ...

  10. java.lang.NoSuchMethodError: org.springframework.web.context.ConfigurableWebApplicationContext.setId

    运行spring报了这个错误,网上说是spring版本冲突,检查maven依赖,发现我依赖的是spring-core.3.0.5,但是spring-orm和spring-tx依赖了spring-bea ...