(原创)个人理解:
模板,故名思义,就是一个模子;
模板分为:类模板和函数模板(也可叫模板类和模板函数);
模板特点:(1)函数名字一样;
(2)调用的形参的数据类型不同,但形参个数相同;
(3)函数实现的功能一样,因为实质上就是一个函数;
模板形式:模板需再类或者函数定义前加上 template<typename T> 或 template<class T>,函数实现中的形参类型也需要是 T ;
其中,T就是数据类型,int/float/char或者自己定义的结构体类型;
比如:
template<typename T> 或 template<class T>
T funName( T parm1,T parm2 )
{
//函数返回类型为T;
}
或者自定义固定的返回类型:
template<typename T> 或 template<class T>
int funName( T parm1,T parm2 )
{
//函数返回类型为int;
}
当然上面int也可为float/void等类型;
===================================================================================
模板与重载的区别:
重载,顾名思义,重新加载/重新载入,也就是重生了一个函数(就如人思想重生,外表一样,可什么都和以前不一样了);
1 相同点
两者都是一个函数名字;
都可完成不同形参类型的参数输入到相同函数名字的功能;
2 不同点
重载的形参个数可不同,模板需相同;
重载的函数实现功能可不同,模板实现功能相同;
重载需一个一个的列举出函数定义,模板就一个即可;
================================================================================
下面是转摘资源:
1. 模板的概念。
我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值,我们定义MAX()函数需要对不同的数据类型分别定义不同重载(Overload)版本。
//函数1. int max(int x,int y);
{return(x>y)?x:y ;} //函数2.
float max( float x,float y){
return (x>y)? x:y ;} //函数3.
double max(double x,double y)
{return (c>y)? x:y ;}
但如果在主函数中,我们分别定义了 char a,b; 那么在执行max(a,b);时 程序就会出错,因为我们没有定义char类型的重载版本。
现在,我们再重新审视上述的max()函数,它们都具有同样的功能,即求两个数的最大值,能否只写一套代码解决这个问题呢?这样就会避免因重载函数定义不 全面而带来的调用错误。为解决上述问题C++引入模板机制,模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。
2. 函数模板的写法
函数模板的一般形式如下:
Template <class或者也可以用typename T> 返回类型 函数名(形参表)
{//函数定义体 }
说明: template是一个声明模板的关键字,表示声明一个模板关键字class不能省略,如果类型形参多余一个 ,每个形参前都要加class <类型 形参表>可以包含基本数据类型可以包含类类型.
请看以下程序:
//Test.cpp #include <iostream> using std::cout; using std::endl;
//声明一个函数模版,用来比较输入的两个相同数据类型的参数的大小,class也可以被typename代替,
//T可以被任何字母或者数字代替。
template <class T> T min(T x,T y) { return(x<y)?x:y;} void main( ) { int n1=2,n2=10; double d1=1.5,d2=5.6; cout<< "较小整数:"<<min(n1,n2)<<endl; cout<< "较小实数:"<<min(d1,d2)<<endl; system("PAUSE"); }
程序运行结果:
程序分析:main()函数中定义了两个整型变量n1 , n2 两个双精度类型变量d1 , d2然后调用min( n1, n2); 即实例化函数模板T min(T x, T y)其中T为int型,求出n1,n2中的最小值.同理调用min(d1,d2)时,求出d1,d2中的最小值.
3. 类模板的写法
定义一个类模板:
Template < class或者也可以用typename T >
class类名{
//类定义......
};
说明:其中,template是声明各模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个。
例如:定义一个类模板:
// ClassTemplate.h
#ifndef ClassTemplate_HH
#define ClassTemplate_HH template<typename T1,typename T2> class myClass{ private:
T1 I;
T2 J; public:
myClass(T1 a, T2 b);//Constructor
void show();
}; //这是构造函数
//注意这些格式 template <typename T1,typename T2> myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b){} //这是void show(); template <typename T1,typename T2> void myClass<T1,T2>::show()
{
cout<<"I="<<I<<", J="<<J<<endl;
}
#endif // Test.cpp #include <iostream>
#include "ClassTemplate.h"
using std::cout;
using std::endl; void main()
{
myClass<int,int> class1(3,5);
class1.show(); myClass<int,char> class2(3,'a');
class2.show(); myClass<double,int> class3(2.9,10);
class3.show(); system("PAUSE");
}
最后结果显示:
一般来说,非类型模板参数可以是常整数(包括枚举)或者指向外部链接对象的指针。
那么就是说,浮点数是不行的,指向内部链接对象的指针是不行的。
template<typename T, int MAXSIZE>
class Stack{
Private:
T elems[MAXSIZE];
…
}; Int main()
{ Stack<int, 20> int20Stack;
Stack<int, 40> int40Stack;
… };
[ 随手记 4 ]C/C++ 模板(Template)使用/重载区别的更多相关文章
-
Magento的布局(Layout),块(Block)和模板(Template)
public function indexAction() { //remove our previous echo //echo 'Hello Index!'; $this->loadLayo ...
-
Silverlight 模板(Template)使用
模板(Template)是控件另一种样式 它和样式(style)不同的是它允许已有的控件进行组合新的一个控件样式 那么先看一下最简单Template代码 xaml代码 <Button Conte ...
-
Python - 定制pattern的string模板(template) 具体解释
定制pattern的string模板(template) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/28625179 ...
-
微信小程序开发--模板(template)使用,数据加载,点击交互
微信小程序视图层提供了 模板(template),可以在模板中定义代码片段,然后在不同的地方调用.结果在数据渲染那懵逼了.按照官网上对模板的说明和对数据的加载. 1.定义模板 使用name属性,作为模 ...
-
C++类模板 template <;class T>;
C++在发展的后期增加了模板(template )的功能,提供了解决这类问题的途径.可以声明一个通用的类模板,它可以有一个或多个虚拟的类型参数. 比如: class Compare_int class ...
-
C++ - 模板(template)中typename的使用方法
声明template参数时, 前缀关键字class和typename可以互换; 使用关键字typename标识嵌套从属类型名称, 但不需在基类列表和成员初始化列表内使用. 从属名称(dependent ...
-
【template、import、include】微信小程序:模板(template)、引用(import、include)说明
模板(template): 定义模板 <template name="[String]"> <!-- 模板代码 --> <view> <t ...
-
c++ 模板template
1.函数模板的声明 声明形式 template<typename 数据类型参数标识符> <返回类型><函数名>(参数表) { 函数体 } 注: templa ...
-
elasticsearch模板 template
https://elasticsearch.cn/article/335 elasticsearch模板 template 可以考虑的学习点: mapping的 _default_类型 动态模板:dy ...
-
小程序使用模板template
小程序使用模板template 1.介绍:模板就是代码的高度复用,将在很多页面使用了相同的部分可以使用模板封装 <!-- 在页面组件中使用 --> <!-- 此时定义了一个模板 -- ...
随机推荐
-
Go语言开发
Go语言圣经(中文版) Go编程语言规范 搭建Go开发及调试环境(LiteIDE + GoClipse) -- Windows篇 Go开发工具 Go命令行操作命令详细介绍 ...
-
IOPS-百度百科
IOPS (Input/Output Operations Per Second),即每秒进行读写(I/O)操作的次数,多用于数据库等场合,衡量随机访问的性能.存储端的IOPS性能和主机端的IO是不同 ...
-
05章 OGNL
一.OGNL全称是Object Graph Navigation Language,即对象导航图语言 OGNL在框架中主要做两件事情:表达式语言和类型转换器 OGNL在框架中的作用以及数据的流入流出: ...
-
HTTP协议状态码
如果向您的服务器发出了某项请求要求显示您网站上的某个网页(例如,当用户通过浏览器访问您的网页或在检测工具抓取该网页时),那么,您的服务器会返回 HTTP 状态代码以响应该请求. 一些常见的状态代码为: ...
-
Mac下安装 php+nginx+mysql 开发环境
一.mysql安装 mysql是安装最简单顺利的 1. 首先去官方网站下载Mac适用的MySQL的dmg包 下载页面 选择图中最下方的dmg包下载进行安装 安装完成后 MySQL的安装目录为/usr/ ...
-
aix 在线软件包安装 字符集 mysql安装
http://www.oss4aix.org/download/rpmdb/deplists/ Aix6.1 安装mysql别的我就不扯了,自从Oracle收购sun后 Mysql在Aix Parch ...
-
把war包放到Tomcat安装文件夹下,不能直接訪问的解决方式
临床表现: Tomcat启动后首页能訪问(http://localhost:8080/). 将自己写的一个webprojectwar包放到Tomcat安装文件夹下的/webapps以下(比方hello ...
-
Clojure绘制UML
简单介绍 使用Clojure封装了Graphviz的使用.眼下主要实现了UML的绘制 使用 以命令模式的UML为例,演示cdraw的使用 安装Graphviz cdraw是对Graphviz的简单封装 ...
-
ML - 特征选择
1. 决策树中的特征选择 分类决策树是一种描述对实例进行分类的树型结构,决策树学习本质上就是从训练数据集中归纳出一组分类规则,而二叉决策树类似于if-else规则.决策树的构建也是非常的简单,首先依据 ...
-
dubbo+zookeeper注册服务报错问题:No service registed on zookeeper
2019-04-04 11:23:40,372 ERROR [tomcat-threads--1] (com.bill99.dolphin.controller.ExceptionController ...