C++模板的理解与使用
最近发现原来学的东西根本都不理解,所以本人正在恶补C++,把自己对C++中概念的最简单粗暴的理解写下来。
有问题的地方还请指出~随时更正
模板:顾名思义,就是为了方便以后使用而出现的东西,生活中的模板让我们可以轻松仿照而做出自己的东西,C++中的模板也是类似的。
一句话理解模板,类型参数化,让程序员编写与类型无关的代码。
我们知道任何语言变量都是有类型的,C/C++/Java,包括那些所谓的基于对象的语言JavaScript(var声明一切变量)和Lua(local声明一些变量),其实本质上也是分为整形,字符串等等的。
我们在编写一个函数时,往往要传入不同类型的参数,而在C或者C++这样的语言中,我们一般只能传一种类型的参数,比如:一个简单的比较大小的功能函数
int Max(int num1,int num2)
{
return a>b?a:b;
}
很明显这样的函数只能比较整型变量,如果想比较float ,double等还需要重新写几乎一模一样的代码(逻辑完全相同),所以造成代码冗余重复。
这样,模板应运而生,你可以把类型参数化,功能逻辑写好后,相比较什么类型都可以,不是很方便么~
(但是也不能任何情况都这么写,因为有的时候你不希望编码者去把char字符拿来比较,这时候就只写int类型的可以限制错误的范围,否则之后可能会出现不太容易的发现的错误结果,因为这样的情况下编译时没有问题的)
所以,下面我们介绍第一种模板——函数模板。格式如下,
template <class 形参名,class 形参名,......> 返回类型
函数名(参数列表)
{
函数体
}
这里的class关键字可以用typename来取代(我们可以暂且认为两者没有区别)
下面直接上代码:min函数模板可以比较任意两个类型的变量。
#include <iostream>
Using namespace std; template <class T> T min(T a,T b)
{
Return a<b?a:b;
} Void main()
{
int a=4;
int b=8;
cout<<"a,b中比较小的是"<< min(a,b)<<endl;
double</span> a1=1.0;
double</span> b1=3.09;
cout<<"a1,b1中比较小的是"<<min(a1,b1)<< endl; }
这里的T就是可以变化的类型,假如我们想比较int类型的,那上面模板里的所有T换成int就可以了。
注意:不能为同一个模板类型形参指定两种不同的类型,上面的例子中不能写成min(a,b1);
如果我们想实现int和double的比较,就可以这样写
template <class T,class M> T min(T a,M b)
{
Return a<b?a:b;
}
然后T=int,M=double,就可以了。<>里面可以定义无数个你想要的类型(理论上),并在后面像普通的类型一样引用。
给初学者的小提示:在真正项目中经常会出现很多不认得的名字,比如
template <class _T_ptr,class _M_ptr> _T_ptr min(_T_ptr a,_M_ptr b)
{
Return a<b?a:b;
}
对于菜鸟来说好像看起来就厉害好多,其实掌握基本语法与结构,这就不是问题了。。要耐心去看)
那么,下面我们介绍第二种模板——类模板。格式如下,
template<class 形参名,class 形参名,…> class 类名
{
类的方法和属性
};
下面接着上代码:
#inlcude <iostream>
template <class T> class Modle
{ private:
T value;//这里T就相当于一个类型
public:
Modle(T t)
{
Value=t;
}
Void setValue(T v)
{
Value=v;
}
T getValue()
{
Return value;
} }
template <T> //这里是在类模板外面声明成员函数的方法
void myClass<T>::show() {
cout<<"value="<<value<<endl;
}
Modle <int> a(5), b(10); //这里注意类模板的用法,在类名后用<>加入你想要的类型cout<<"a.value:"<<a.getValue()<<endl;cout<<"b.value:"<<b.getValue()<<endl;
//测试char类型数据
Modle ch('A');
cout<<"ch.value:"<<ch.getValue()<<endl;
ch.setValue('a');
cout<<"ch.value:"<<ch.getValue()<<endl;
我们使用的STL中经常会看到这种声明, Vector<int> num;这回我们就应该理解了,stl里面的容器都是类模板,去查一下源代码,你会发现你可以理解它的原理的。
这里再贴一个提示:摘自觅思.澈的博客
对于template<class
T>T g(T a, T b){}。当我们声明类对象为:A<int> a,语句调用a.g(2,
3.2)在编译时不会出错,但会有警告,因为在声明类对象的时
候已经将T转换为int类型,而第二个实参3.2把模板形参指定为double,在运行时,会对3.2进行强制类型转换为3。
当我们声明类的对象为:A<double>
a,此时就不会有上述的警告,因为从int到double是自动类型转换。这是和函数模板不同的一点。
对于模板里的形参(就是这个尖括号里面的东西<class
T>):有类型形参,非类型形参,模板形参三种。
上面举得例子都是类型形参,也就是<>里面声明是由class或typename完成的。
待进一步学习后,会把其他两种情况的理解分享出来~
C++模板的理解与使用的更多相关文章
- 用一道模板题理解多源广度优先搜索(bfs)
题目: //多元广度优先搜索(bfs)模板题详细注释题解(c++)class Solution { int cnt; //新鲜橘子个数 int dis[10][10]; //距离 int dir_x[ ...
- kmp算法模板及理解
kmp算法是复杂度为O(n+m)的字符串匹配算法; 首先kmp算法的核心是在模式串中获得next数组,这个数组表示模式串的子串的前缀和后缀相同的最长长度; 这样在匹配的过程中如果指到不匹配的位置,模式 ...
- 差异:后缀数组(wzz模板理解),单调栈
因为涉及到对模板的理解,所以就着代码看会好一些. 让那些坚决不颓代码的人受委屈了. 我是对着wzz的板子默写的,可能不完全一样啊. 还有代码注释里都是我个人的理解,不保证正确,但欢迎指正. 可以有选择 ...
- C++中函数模板的深入理解
1,函数模板深入理解: 1,编译器从函数模板通过具体类型产生不同的函数: 1,模板就是模子,通过这个模子可以产生很多的实物: 2,函数模板就是编译器用来产生具体函数的模子: 2,编译器会对函数模板进行 ...
- WPF快速入门系列(7)——深入解析WPF模板
一.引言 模板从字面意思理解是“具有一定规格的样板".在现实生活中,砖块都是方方正正的,那是因为制作砖块的模板是方方正正的,如果我们使模板为圆形的话,则制作出来的砖块就是圆形的,此时我们并不 ...
- c++模板类
c++模板类 理解编译器的编译模板过程 如何组织编写模板程序 前言常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”.看看我们几乎每天都能遇到的模板类吧,如S ...
- 【BZOJ 1901】【Zju 2112】 Dynamic Rankings 动态K值 树状数组套主席树模板题
达神题解传送门:http://blog.csdn.net/dad3zz/article/details/50638360 说一下我对这个模板的理解: 看到这个方法很容易不知所措,因为动态K值需要套树状 ...
- [Reprint] C++函数模板与类模板实例解析
这篇文章主要介绍了C++函数模板与类模板,需要的朋友可以参考下 本文针对C++函数模板与类模板进行了较为详尽的实例解析,有助于帮助读者加深对C++函数模板与类模板的理解.具体内容如下: 泛型编程( ...
- render_template 网页模板
模板简单介绍: 视图函数:视图函数就是装饰器所装饰的方法,视图函数的主要作用是生成请求的响应,这是最简单的请求.实际上,视图函数有两个作用:处理业务逻辑和返回响应内容.在大型应用中,把业务逻辑和表现内 ...
随机推荐
- 自定义adapter 的getView方法被重复执行了n次的解决方法
1. getView执行的次数和你的getCount没有直接的关系 ,getCount和你listView里面的条目数量(行数量)有关系 ,getView方法执行次数取决于你屏幕上显示几个条目,比 ...
- oracle备份和升级数据库
同oracle用户登录数据库驻留server.例如,主文件夹/home./oracle.运行以下命令来执行备份操作. sqlplus /nolog connect /as sysdba sql> ...
- zcelib - One cplusplus C++ crossplatform library use for develop server,similar to ACE.
zcelib - One cplusplus C++ crossplatform library use for develop server,similar to ACE.OS适配层,为了适应WIN ...
- 安装在谷歌axure小工具
下载插件 第一步 第二步 第三步 第四步 版权声明:本文博客原创文章.博客,未经同意,不得转载.
- C#使用Selenium实现QQ空间数据抓取 说说抓取
上一篇讲的是如何模拟真人操作登录QQ空间,本篇主要讲述一下如何抓取QQ说说数据 继续登录空间后的操作 登陆后我们发现QQ空间的菜单其实是固定的,只需要找到对应元素就可以,继续XPath 可以得到地址 ...
- ios 时间戳 当前时间 相互转化
1.今天在做一个webservice的接口的时候,被要求传一个时间戳过去,然后就是开始在Google上找 2.遇到两个问题,一,当前时间转化为时间戳,二,获取的当前时间和系统的时间相差8个小时 一,转 ...
- 最简单的IdentityServer实现——项目基本结构与流程
项目结构 共分为三个组成部分: IdentityServer:用于登录.身份认证与授权 Api:提供获得授权后调用的各接口 Client(客户端,控制台):访问IdentityServer授权,再访问 ...
- 读BeautifulSoup官方文档之与bs有关的对象和属性(2)
上一节说到tag, 这里接着讲, tag有个属性叫做string, tag.string其实就是我们要掌握的四个对象中的第二个 ---- NavigableString, 它代表的是该tag内的te ...
- jquery li练习2-恢复链条
<!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...
- WPF关于控件 父级控件,子级控件,控件模板中的控件,等之间的相互访问
原文:WPF关于控件 父级控件,子级控件,控件模板中的控件,等之间的相互访问 1,在菜单中访问 弹出菜单的控件 var mi = sender as MenuItem;//菜单条目 MenuItem ...