今天再看stl的时候看到了模板的使用,就在csdn上看了下template,找到这片讲解比较详细的就转载一下,供日后学习查看。

1、Template/Typename/Class introduction

在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢?
答:class用于定义类,在模板引入c++后,最初定义模板的方法为:template,这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字,它的作用同class一样表明后面的符号为一个类型,这样在定义模板的时候就可以使用下面的方式了: template.在模板定义语法中关键字class与typename的作用完全一样。

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

(1) 什么是类模板

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

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

(2)类模板定义

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

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

template <class T>class foo{//body}

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

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;}

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

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++;}

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

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

3.函数模板和模板函数

(1)函数模板

函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计。它的最大特点是把函数使用的数据类型作为参数。
函数模板的声明形式为:

template<typename(或class) T>
//<返回类型><函数名>(参数表)
{//function body
}

其中,template是定义模板函数的关键字;template后面的尖括号不能省略;typename(或class)是声明数据类型参数标识符的关键字,用以说明它后面的标识符是数据类型标识符。这样,在以后定义的这个函数中,凡希望根据实参数据类型来确定数据类型的变量,都可以用数据类型参数标识符来说明,从而使这个变量可以适应不同的数据类型。例如:

template<typename/*或class*/ T>
T fuc(T x, T y)
{T x;//……
}

函数模板只是声明了一个函数的描述即模板,不是一个可以直接执行的函数,只有根据实际情况用实参的数据类型代替类型参数标识符之后,才能产生真正的函数。

(2)模板函数:

模板函数的生成就是将函数模板的类型形参实例化的过程。

例如:

 double d;int a;fuc(d,a);

则系统将用实参d的数据类型double去代替函数模板中的T生成函数:

double fuc(double x,int y)
{double x;//……
}

Template简介相关推荐

  1. NiFi 模板(Template)简介

    模板使用 当我们使用处理器(Processor) 在 NiFi 中设计复杂的数据流处理流程时, 我们经常会发现, 我们将相同的处理器序列串在一起以执行某些任务.这种情况下, NiFi 提供了模板的概念 ...

  2. Spring组件之一 JDBC Template

    JDBC Template是基于JDBC的基础上产生的,所以在讲JDBC Template之前,先聊聊 JDBC ? 什么是JDBC ? JDBC(Java DataBase Connectivity ...

  3. Django框架简介-初级(简单留言板)

    Django框架(综合各方知识) 介绍Django和设计模式 CGI方式开发web MVC 设计模式 web各部分说明 主要内容 结构说明 必要步骤 简单体验留言板 进阶留言板:css和html分离, ...

  4. 04.search_template

    文章目录 1. Search Template简介 2. 样例Examples 1. 存储一个template Store a search template 1. Search Template简介 ...

  5. GO 语言中模板渲染的原理

    文章目录 Go Template 简介 模板的结构 Template 与 common 的结构 模板函数和方法 New() 函数和 init() 方法 New() 方法 Parse() 方法 Pars ...

  6. ios静态库和代码同名_使用一个代码库开始制作NativeScript iOS和Android应用程序

    ios静态库和代码同名 Users can choose whatever operating system they prefer, but every operating system use d ...

  7. 基于PHP的论文管理系统的设计与实现

    目 录 论文总页数:27页 1 引言 1 2 系统需求 1 2.1 系统需求概述 1 2.2 系统详细需求分析 1 2.2.1 基于web开发 1 2.2.2 格式化文档 2 2.2.3 前台需求 2 ...

  8. 流技术安全系统-流量流向监控技术

    流技术基础 1. 流量流向监控技术 1.1 流量流向监控技术  SNMP采集   RMON探针 网络流量检测技术(NetFlow,NetStream,Sflow,Cflowd和IPFIX)  npro ...

  9. Django学习(三)——MVC架构

    第四章 Django的MVC框架 4.1 Django的MVC框架简介 MVC是一种软件工程设计方法,它把一个要创建的系统分成三部分,分别是Model数据模块,View视图模块以及Controller ...

最新文章

  1. 13种编程语言名称的来历
  2. [cocos2dx]防止八门神器修改内存数据
  3. quartusII中功能仿真和时序仿真的分析
  4. 局域网服务器共享文件怎么设置,【局域网共享文件】局域网如何文件共享_局域网共享设置文件夹_佰佰安全网...
  5. 4.1.4 OS之文件的物理结构(连续分配、链接分配[隐式-显式]、索引分配[链接方案-多层索引-混合索引])
  6. OpenCV iOS Hello World应用程序
  7. geometry-api-java 学习笔记(三)多点 multipoint
  8. Angular HTML template的解析位置
  9. Android_(游戏)打飞机04:绘画敌机、添加子弹
  10. winform list集合怎么 in过滤_Java List集合遍历数据的八种方式
  11. 10.大数据架构详解:从数据获取到深度学习 --- 存储是基础
  12. 接口解读:你的姓名+身份证号撑起了超11亿元市场规模,你造吗?
  13. 推荐C语言编译器(手机APP)
  14. 【树形dp 题解】 洛谷P3174 毛毛虫
  15. D-Link 智能家居新品将登陆苹果中国官网
  16. 数据分析师到底是做什么的?写Python或SQL语句?
  17. LaTeX调整页眉宽度适应文本
  18. 欧拉函数|(扩展)欧拉定理|欧拉反演
  19. QMetaObject使用
  20. ApacheDS使用详细教程

热门文章

  1. 记录一个连接,走遍美国视频下载
  2. html实现富文本编辑器,前端程序员福利,6款轻量级富文本编辑器,轻松实现富文本编辑...
  3. 数据库总结/个人总结
  4. php 实现邮件定时发送,PHP 定时发送邮件
  5. 算法搬运工——给YOLOV5加界面
  6. 编写一个程序,求1加到100的和
  7. 服务器断开占用,绝地求生全军出击服务器断开怎么办 掉线解决方法
  8. maptask 的环形缓冲区 重点理解介绍
  9. SSH笔记-Struts2的语言国际化
  10. 极客20届 第二周练习