前言


●   模板(Template)是一个包含未指定类型的函数或类, 因此模板并不是一个真正的函数或类, 而是代表了一组函数或类, 当为模板函数或类指定了一种类型时,就生成了此模板的一个实例, 这个操作叫做模板实例化。

●  模板可分为函数模板和类模板, 而函数模板又可以分为函数模板和模板函数。对于函数模板, 当编译系统发现了一个对应的函数调用时,将根据实参的类型来确认是否匹配函 数模板中对应的形参, 然后生成一个重载函数, 称该重载函数为模板函数。

函数模板与模板函数的区别在于:函数模板与类相似,是模板的定义; 而模板函数与对象相似,它是函数模板的实例, 具有程序代码、占用内存空间等特征.

● 同样, 在说明了一个类模板后,也可以创建类模板的实例,即生成模板类。类模板与模板类的区别在于: 类模板是模板的定义,不是一个实实在在的类,模板类才是实实在在的类。


函数模板


●  函数模板是C++的新特性, 这个概念在C语言中是没有的。与函数不同的是, 函数模板不是一个实实在在的函数, 而是对逻辑功能相同但数据类型不同的一种函数的统一描述。利用函数模板,可以对函数的类型(返回类型、参数类型)进行参数化处理,也就是函数的类型也可以像变量一样改变。利用函数模板可以用一种逻辑过程处理不同类型的数据,从而极大地提高了编程的效率。

●   函数模板的定义格式如下:

template < class 模板类型参数名1 ,class 模板类型参数名2,.....>
返回类型 函数名 (参数表)
{// Statement}

格式说明如下:

(1)模板类型参数名代表形形色色数据类型的通用参数名,它可以代表基本数据类型,也可以代表类。

(2)函数模板允许使用多个模板类型参数名, 但在template定义部分的每个参数前必须有关键字 typename或class.

(3)关键字template总是放在模板的定义与声明的最前面,它后面用逗号分隔的模板参数表必须用尖括号 括起来。

(4)模板参数表不能为空模板参数,可以是一个模板类型参数,它代表一种类型;也可以是一个模板非类型参数,它代表了一个常量。

(5) 格式中关键字class也可以是关键字typename.

(6)在template语句与函数模板定义语句 “ 返回值类型 ”之间不允许有别的语句。

template <typename T, typename S>
T max(T a, S b)
{return a > b ? a : b;
}
int main()
{cout << "较大者是:" << max(3.5, 100) << endl;system("pause");return 0;
}

上述程序给函数模板实例化。

● 在创建函数模板时需要注意以下几点:

如果在全局域中声明了与模板类型参数同名的对象函数或类型,则该全局名将被隐藏,如下面的例子中tmp的类型不是double,而是模板参数Type.

typedef double Type;
template <typename Type>
Type max(Type a, Type b)
{return a > b ? a : b; //tmp类型为模板参数Type,不是全局类型double
}
int main()
{cout << "较大者是:" << max(3.5, 100.0) << endl;system("pause");return 0;
}

在函数模板的定义中, 声明的对象或类型不能与模板参数名同名,例如:

template <typename Type>
Type max(Type a, Type b)
{typedef double Type; //错误,重新声明模板参数Typereturn a > b ? a : b; //tmp类型为模板参数Type,不是全局类型double
}
int main()
{cout << "较大者是:" << max(3.5, 100.0) << endl;system("pause");return 0;
}

模板参数名在同一模板参数表中只能被使用一次, 但是模板参数名可以在多函数模板声明或定义之间被重复使用,例如:

template <typename Type, typename Type>
Type max(Type a, Type b); //错误,模板参数名Type的非法重复使用
template <typename Type, typename Type>
Type max(Type a, Type b); //错误,模板参数名Type的非法重复使用
template <typename Type>
Type min(Type a, Type b);template <typename Type>
Type man(Type a, Type b); //正确,名字Type在不同模板之间重复使用

如果一个函数模板有一个以上的模板类型参数, 则每个模板类型前面都必须有关建字class或typename,例如:

template <typename Type>
Type min(Type a,  b); //错误

同非模板函数一样,函数模板也可以被声明为inline或extern,  可以把关键字inline或extern 放在模板参数表后面,而不是在关键字template前面:

template <typename Type>
inline Type min(Type a, Type  b); 

模板函数


●  函数模板的模板类型参数名实际上是一个类型形参,在使用函数模板时, 要将这 个形参实例化为确定的数据类型。将类型形参实例化的参数称为模板实参, 用模板实参实例化的函数称为模板函数。模板函数的生成就是将函数模板的类型形参实例化的过程。

●  模板函数类似于重载函数, 但两者有很大区别: 函数重载时,每个函数体内可以执行 ,不同的动作,但同一个函数模板实例化后的模板函数都必须执行相同的动作。函数模板的调用格式如下:

函数名<实参类型参数1,实参类型参数2,...> (实参表)

当通过调用格式调用函数模板时, 编译程序会自动将实参表中具体的数据类型替换函数模板中的类型参数,生成一个隐含的重载函数,该重载函数的程序代码与函数模板相同, 类型则采用实参表中的具体数据类型。如对于如下函数模板:

template <typename Type>
inline Type min(Type a, Type  b)
{return a < b ? b : a;
}int main()
{auto result = min<int>(2, 33);cout << "输出结果为:" << result << endl;system("pause");return 0;
}

类模板


●  类模板的定义语法为:

template < typename 模板类型参数名1,typename 模板类型参数名n,... ,内置类型 标识符n >
class 类模板名
{// class definition}

“ < > ” 里如果是类型参数, 则以 typename或class声明; 如果是非类型参数(比如说: int tt), 则其声明语法同普通函数参数的声明语法类似.  非类型参数通常在模板定义过程中当做常量使用。那么在带有非类型参数的模板, 在实例化时需要用一个常量来指定这个参数。

该常量可以是:  #define 、 const 、 enum 、constexpr 这些关键字声明的。

●   类模板的成员函数在类外定义语法为:

template <typename 模板类型参数列表>
函数返回类型 类名 < 模板类型参数列表 >:: 函数名(参数表)
{// Statements
}

模板参数的默认实参


●  在定义类模板时, 可以设定 “ 模板类型参数名 ” 的默认值, 即参数的默认实参。这包括默认类型参数  和 默认的 非类型参数。

typename < typename T = int , int size = 100 > arr
{}

那么在实例化一个 arr 的模板时,  就可以不需要指定模板参数名的实参:

arr <> myArr

注意: 与函数模板的实例化不同的, 类模板实例化时包围实参列表的尖括号不可省略。


模板类


●  说明:  类模板是模板,不是实际的类。 使用类模板时必须先实例化, 即给类的模板参数名赋值,  包括 类型参数 和 非类型参数。那么模板类是模板实例化的结果,  是真正可以用来声明对象的类。

●  那么实例化类模板时,提供给 模板类型参数的实参可以是内置类型,也可以是自定义类型。 与函数模板不同的是, 类模板在实例化时没有参数推导机制, 所有的模板类型参数必须指定,  除非 模板类型参数带有默认实参。

●  那么实例化类模板时, 编译器用开发者指定的模板实参代替模板定义中的模板类型参数, 创建出一个真正的类, 然后用这个类定义类对象。

《随笔二十二》—— C++中的“ 函数模板 和 类模板 ”相关推荐

  1. C++笔记7:C++提高编程1:模板—[函数模板和类模板]

    0820 C++提高编程: 1.模板-[函数模板和类模板] 2.初识STL 3.STL-常用容器 4.STL-函数对象 5.STL-常用算法 C++提高编程引言: C++除了面向对象编程思想,还有泛型 ...

  2. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

  3. 【C语言】二十二步了解函数栈帧(压栈、传参、返回、弹栈)

    阅读本文需要掌握的知识 熟练使用--c语言函数 进入正题前 首先我们为什么要学习函数的栈帧? 简单回答就是:增加内功 学习函数调用的底层代码,了解函数如何传参.如何返回 这样对于函数的使用有很大的帮助 ...

  4. splice php,浅谈PHP源码二十二:关于array_splice函数

    这篇文章主要介绍了关于 浅谈PHP源码二十二:关于array_splice函数,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 浅谈PHP源码二十二:关于array_splice函数 a ...

  5. 实验二十二 SCVMM中的SQL Server配置文件

    实验二十二 SCVMM中的SQL Server配置文件 在VMM 2012中管理员可以使用 SQL Server 配置文件,在部署完成虚拟机之后,实现 SQL Server 数据库服务自动化部署并交付 ...

  6. 二十五.SLAM中Mapping和Localization区别和思考

    专栏系列文章如下: 一:Tixiao Shan最新力作LVI-SAM(Lio-SAM+Vins-Mono),基于视觉-激光-惯导里程计的SLAM框架,环境搭建和跑通过程_goldqiu的博客-CSDN ...

  7. (98)利用函数function实现半字节加法功能,面试必问(二十二)(第20天)

    (98)利用函数function实现半字节加法功能,面试必问(二十二)(第20天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)利用函数function实现半字 ...

  8. JavaScript学习(二十)—DOM中常用的属性

    JavaScript学习(二十)-DOM中常用的属性 1.clientWidth属性 作用:获取元素或页面的可视的区域的宽度 格式:节点.clientWidth 2.clientHeight属性 作用 ...

  9. 2021年大数据Hadoop(二十二):MapReduce的自定义分组

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 MapReduce的自定义分组 需求 分析 实现 第一步: ...

  10. 插入DLL和挂接API——Windows核心编程学习手札之二十二

    插入DLL和挂接API --Windows核心编程学习手札之二十二 如下情况,可能要打破进程的界限,访问另一个进程的地址空间: 1)为另一个进程创建的窗口建立子类时: 2)需要调试帮助时,如需要确定另 ...

最新文章

  1. 中文版-He Knows My Name(他知道我的名字)-祂认得我-陈熙(音乐河4)
  2. Nature子刊:精胺介导稻瘟病菌侵染水稻叶片的新机制!
  3. Bit-Z为什么成为熊市之光?
  4. python使用redis第一节、环境配置
  5. 模板类的全特化、偏特化
  6. Wannafly挑战赛19
  7. pipenv相关指令
  8. 【Effective Java】第二章:静态工厂、构建器、强化Singleton属性、私有构造器、
  9. 支付宝上线新功能:一定要给家人开通!
  10. Java 编译,运行错误之 java.lang.UnsupportedClassVersionError: Bad version n umber in .class file
  11. 2014.10.18笔记
  12. 文本推理_基于事理图谱的文本推理
  13. matlab中怎么找晶闸管,matlab中晶闸管如何连接
  14. 【电商】电商后台设计—电商产品的用户体系
  15. 易基因 | 转录组测序在原核生物研究中的应用(4)| 文献科普
  16. Ribbon整合Eureka报错no instances available
  17. 6s芯片测试软件,如何简单检测你的苹果使用什么处理器办法
  18. 操作数据库方法总结1——JDBC、连接池与JDBCTemplate
  19. matlab 毕业答辩,MATLAB的答辩.ppt
  20. JavaWeb实现登录验证码

热门文章

  1. 将jpg格式转成PDF格式的转换器
  2. JVM监控Jconsole
  3. 安卓软件汉化教程附带汉化工具Android Res Edit V1.5
  4. 计算机组成原理补码位算法,[计算机组成原理] Booth算法 —— 补码一位乘法
  5. 酒店客房管理系统安排 Java项目 毕业设计项目不用愁
  6. topaz remask破解版|topaz remask抠图神器5破解版下载
  7. 【从Northwind学习数据库】数据更新
  8. python实验原理_python实验报告5
  9. 实现写邮箱html页面,用html写的简单的邮箱登陆界面
  10. webstorm做项目第三天——开始登陆界面