类模板 与 模板类

1.类模板与模板类的概念

 什么是类模板 一个类模板(也称为类属类或类生成类)允许用户为类定义一种模式,使得类中的某些数据成员、默写成员函数的参数、某些成员函数的返回值,能够取任意类型(包括系统预定义的和用户自定义的)。

  如果一个类中数据成员的数据类型不能确定,或者是某个成员函数的参数或返回值的类型不能确定,就必须将此类声明为模板,它的存在不是代表一个具体的、实际的类,而是代表着一类类。

 类模板定义 定义一个类模板,一般有两方面的内容:

A.       首先要定义类,其格式为:

template <class T>

class foo

{

……

}

foo 为类名,在类定义体中,如采用通用数据类型的成员,函数参数的前面需加上T,其中通用类型T可以作为普通成员变量的类型,还可以作为conststatic成员变量以及成员函数的参数和返回类型之用。例如:

template<class T>

class Test{

private:

    T n;

    const T i;

    static T cnt;

public:

    Test():i(0){}

    Test(T k);

    ~Test(){}

    void print();

    T operator+(T x);

};

B.       在类定义体外定义成员函数时,若此成员函数中有模板参数存在,则除了需要和一般类的体外定义成员函数一样的定义外,还需在函数体外进行模板声明

例如

template<class T>

void Test<T>::print(){

    std::cout<<"n="<<n<<std::endl;

    std::cout<<"i="<<i<<std::endl;

    std::cout<<"cnt="<<cnt<<std::endl;

 

}

如果函数是以通用类型为返回类型,则要在函数名前的类名后缀上“<T>”。例如:

template<class T>

Test<T>::Test(T k):i(k){n=k;cnt++;}

template<class T>

T Test<T>::operator+(T x){

               return n + x;

               }

C.       在类定义体外初始化const成员和static成员变量的做法和普通类体外初始化const成员和static成员变量的做法基本上是一样的,唯一的区别是需在对模板进行声明,例如

template<class T>

int Test<T>::cnt=0;

template<class T>

Test<T>::Test(T k):i(k){n=k;cnt++;}

 类模板的使用 类模板的使用实际上是将类模板实例化成一个具体的类,它的格式为:类名<实际的类型>

  

模板类是类模板实例化后的一个产物。说个形象点的例子吧。我把类模板比作一个做饼干同的模子,而模板类就是用这个模子做出来的饼干,至于这个饼干是什么味道的就要看你自己在实例化时用的是什么材料了,你可以做巧克力饼干,也可以做豆沙饼干,这些饼干的除了材料不一样外,其他的东西都是一样的了。

2.类模板的派生

  可以从类模板派生出新的类,既可以派生类模板,也可以派生非模板类。派生方法:

⑴ 从类模板派生类模板可以从类模板派生出新的类模板,它的派生格式如下例所示:

template <class T>

class base

{

……

};

 

template <class T>

class derive:public base<T>

{

……

};

与一般的类派生定义相似,只是在指出它的基类时要缀上模板参数,即base<T>

⑵ 从类模板派生非模板类  可以从类模板派生出非模板类,在派生中,作为非模板类的基类,必须是类模板实例化后的模板类,并且在定义派生类前不需要模板声明语句:template<class>。例如:

template <class T>

class base

{

……

};

 

class derive:public base<int>

{

……

};

在定义derive类时,base已实例化成了int型的模板类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464817.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 网站发送验证码_Python爬虫模拟登录带验证码网站

爬取网站时经常会遇到需要登录的问题&#xff0c;这是就需要用到模拟登录的相关方法。python提供了强大的url库&#xff0c;想做到这个并不难。这里以登录学校教务系统为例&#xff0c;做一个简单的例子。首先得明白cookie的作用&#xff0c;cookie是某些网站为了辨别用户身份、…

二分法查找(Java)

二分法查找 时间复杂度为O(logn) public class BiSearch { public static int search(int[] data, int find){int low 0;int mid 0;int upper 0;if (null data) {return -1;}upper data.length - 1;while (low < upper) {mid (low upper)/2;if (data[mid] &g…

Linux同步原语系列-spinlock及其演进优化

1. 引言通常我们的说的同步其实有两个层面的意思&#xff1a;一个是线程间的同步&#xff0c;主要是为了按照编程者指定的特定顺序执行&#xff1b;另外一个是数据的同步&#xff0c;主要是为了保存数据。为了高效解决同步问题&#xff0c;前人抽象出同步原语供开发者使用。不仅…

[转]我在赶集网的两个月 7.4(完结)

转自&#xff1a;http://www.itiger.cn/?p678 转发这个文章的目的&#xff0c;表示对作者的敬佩&#xff0c;工作就是需要如此&#xff0c;需要有想法&#xff0c;需要总结。赶集少了这样的人才&#xff0c;可悲啊。 发信人: Caolixiang (慕慕珍珍), 信区: WorkLife 标 题: 我…

linux环境部署python3+django

1. 确定Linux安装C/C编译器,在线安装: yum install gcc gcc-c autoconf automake 2. 安装依赖环境: yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel 3. …

hp-socket 文本跟图片同时发送_文本、截图和应用,这样「包装」一秒变美观

社交网络被发明出来的一个重要目的就是分享&#xff0c;无论是所见所闻还是喜怒哀乐&#xff0c;亦或是脑海中突然迸发出的一段妙言&#xff0c;某个转瞬即逝的精彩瞬间&#xff0c;一篇深度好文&#xff0c;一个在少数派看到的绝赞应用……分享内容丰富多彩&#xff0c;相比之…

在一个list中增加一个节点

在一个list中增加一个节点typedef struct _list_t {struct _list_t *next;int data; }list;void insert_node(list *head, int i, char x) {list *p head, *q NULL;int j 0;if ((NULL head) || (0 > i)){return ;}while ((NULL ! p) && (j < i-1)){j;p p-&g…

poj2041

简单题 View Code #include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>using namespace std;#define maxn 30char order[maxn];char st[maxn];int l;void work(char ch){char x;int d;switch (ch) …

[转]Angular2 Material2 封装组件 —— confirmDialog确定框

本文转自&#xff1a;https://www.jianshu.com/p/0c566fc1730d 环境&#xff1a; Angular 4.0.0 Angular2 Material2 2.0.0-beta.3 node v7.4.0 npm 4.0.5 使用Dialog封装confirmDialog确定框 源代码 来&#xff0c;首先来看效果图~ 删除例子确定删除框点击确定后返回值1.定义通…

项目实战|100个蓝牙接收器发货了

还记得之前写的这篇文章不&#xff1a;《一个蓝牙实战项目的掏肺总结》&#xff0c;这个项目最近做完了&#xff0c;交了100套出去&#xff0c;这是发货前的大合照&#xff1a;做完此项目&#xff0c;有些许收获&#xff0c;在此分享给大家。东西虽简单&#xff0c;但它依然是一…

删除list中的一个节点

1、删除list中的一个节点&#xff0c;给定位置为i typedef struct _list_t { struct _list_t *next; int data; }list; void delete_node(list *head, int i) {list *p head, *q NULL;int j 0;if ((NULL head) || (0 > i)){return ;}while ((NULL ! p) &&…

内存不足 java.lang.OutOfMemoryError: Java heap space

问题描述Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 解决方案[转] 一直都知道可以设置jvm heap大小&#xff0c;一直用eclipse写/调试java程序。一直用命令行or console加参数跑程序。现象&#xff1a;在eclipse的配置文件eclipse.ini…

【读书笔记】【独立思考】2018-04-03(1)

所有的事物都没有起点&#xff0c;也没有终点&#xff0c;有的只是过程。 不然的话&#xff0c;起点又是从哪里来&#xff1f;起点之前是否还有起点&#xff1f;终点又是从哪里来&#xff1f;终点之后是否还有终点&#xff1f; 从无中来&#xff0c;到无中去&#xff0c;中间的…

深圳的冬天真的来了

天气预报说&#xff0c;明天深圳的天气会很低。热了一整年&#xff0c;这次一定是真的了&#xff0c;大家出门记得穿厚一些。

date js 半年_moment.js 搜索栏获取最近一周,一个月,三个月,半年,一年时间

统计时间label: 统计时间,name: countTime,type: select,data: [{value: 0,text: 最近一周},{value: 1,text: 一个月},{value: 2,text: 三个月},{value: 3,text: 半年},{value: 4,text: 一年}]实现方式searchValue为搜索栏所选所填内容&#xff0c; 以及作为搜索和接口调用条件…

判断CPU大小端模式

int CheckCpuEndian(void) {union{int a;char b;}c;c.a1;return (1 c.b); } 返回1为LittleEndian。 联合体union的存放顺序是所有成员都从 低地址 开始存放, 若是小端模式&#xff0c;由低地址到高地址存放为0x01 00 00 00&#xff0c;c.b被赋值为0x01 CPU有两种字节序&a…

华为eudemon 200E的hrp双心跳热备配置

本文为大家介绍使用两台华为Eudemon200E防火墙实现双机双心跳的HRP热备的配置实例&#xff0c;主要的知识点包括&#xff1a;华为防火墙HRP、VRRP的配置&#xff0c;定义防火墙区域。 一、网络拓扑&#xff1a;二、配置要求&#xff1a; 1、两台防火墙为E200E-A和E200E-B&#…

【洛谷比赛】你的名字。

前言 打比赛的原因只是因为对君名的喜爱&#xff01; 好吧&#xff0c;准确来说没有参赛&#xff0c;只是赛后研究了一下题。我觉得出得蛮好的&#xff0c;优于昨晚那套题。 由于题不是那么水了&#xff0c;我就分开发题解了。 题解 T1 线索 T2 日常 后记 这套题质量确实不错&a…

2021 年 Linux 界的 12 件大事

2021年即将结束了&#xff0c;今天就和大家分享一些来自Linux世界最重要的大事&#xff0c;这些事件大大影响了Linux用户&#xff1a;1、理查德斯托曼回归2019年&#xff0c;自由软件基金会(Free Software Foundation)创始人理查德斯托曼&#xff08;Richard Stallman&#xff…