[ 随手记 4 ]C/C++ 模板(Template)使用/重载区别
(原创)个人理解:
模板,故名思义,就是一个模子;
模板分为:类模板和函数模板(也可叫模板类和模板函数);
模板特点:(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.介绍:模板就是代码的高度复用,将在很多页面使用了相同的部分可以使用模板封装 <!-- 在页面组件中使用 --> <!-- 此时定义了一个模板 -- ...
随机推荐
- linux 下mysql多实例安装
1.软件下载 https://dev.mysql.com/downloads/file/?id=479096 免编译二进制包 mysql-5.6.21-linux-glibc2.5-x86_64.ta ...
- git 删除与撤回
Git 删除与撤回 标签: git 版本管理 删除文件 撤回删除操作 2017年01月13日 22:56:27786人阅读 评论(0) 收藏 举报 分类: Git(4) 版权声明:本文为博主原创文 ...
- android控件基本布局
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android=&qu ...
- Mac搭建SVN服务器+Cornerstone连接服务器
Mac自带svn,我们只需配置并开启就可以了,打开终端,输入svnserve --version查看svn版本 可以看到我的mac自带的svn版本号为1.9.7,下面开始配置服务器: 1.终端输入su ...
- MySQL的一些指令操作[简版]
sudo apt-get install mysql-server pa aux | grep mysql sudo service mysql start sudo service mysql st ...
- python简单爬虫 用beautifulsoup爬取百度百科词条
目标:爬取“湖南大学”百科词条并处理数据 需要获取的数据: 源代码: <div class="basic-info cmn-clearfix"> <dl clas ...
- react系列笔记:第二记-中间件
中间件所做的事情就是在action发起后,到reducer之前做扩展,实现的方式是对store的dispatch进行包装 store.dispatch => [middlewales] => ...
- React中this.setState是同步还是异步?为什么要设计成异步?
在使用react的时候,this.setState为什么是异步呢? 一直以来没有深思这个问题.昨天就此问题搜索了一下. react创始人之一 Dan Abramovgaearon在GitHub上回答了 ...
- 第一周嵌入式程序设计(linux环境下)的学习总结
2014025641 <嵌入式程序设计>第1周学习总结 本周学习内容 首先我们先复习下之前学习过的内容,什么是linux? Linux 就是一个操作系统,就像你多少已经了解的 Window ...
- 单链表数据结构 - java简单实现
链表中最简单的一种是单向链表,每个元素包含两个域,值域和指针域,我们把这样的元素称之为节点.每个节点的指针域内有一个指针,指向下一个节点,而最后一个节点则指向一个空值.如图就是一个单向链表 一个单向链 ...