C++基础|templete
转自:http://www.360doc.com/content/09/0403/17/799_3011262.shtml
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_HHtemplate<typename T1,typename T2>class myClass{private:T1 I;T2 J;public:myClass(T1 a, T2 b);//Constructorvoid 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"); }
最后结果显示:
4.非类型模版参数
一般来说,非类型模板参数可以是常整数(包括枚举)或者指向外部链接对象的指针。
那么就是说,浮点数是不行的,指向内部链接对象的指针是不行的。
template<typename T, int MAXSIZE> class Stack{ Private:T elems[MAXSIZE]; … };Int main() {Stack<int, 20> int20Stack;Stack<int, 40> int40Stack; …};
C++基础|templete相关推荐
- templete inheritance
1. include 法宝 提取公共部分代码放入特定的一个html文件中 用include标记来引入重复的文件的部分 //views.py from django.shortcuts import r ...
- 虚幻基础之Gameplay游戏框架之Level和World
游戏中的虚拟世界是如何组织的呢? 这里,在玩家中流行使用一个词--关卡.玩家们进入关卡,探索关卡内的迷宫,击败关底boss,然后进入下一个关卡,周而复始. 在Unity3D里,这个关卡被称为是Scen ...
- 2022前端知识整理:十、vue基础
十.vue基础 2022前端知识整理:第十部分.vue基础,仅包含vue2.0相关知识,建议先完成html5.css3和JavaScript ES6之后再学习.部分图片未上传成功,稍后完善,请见谅. ...
- 前端程序员需要了解的原生微信小程序-基础知识
前言:该学原生小程序啦 文档: 微信开放文档 工具下载: 稳定版 Stable Build | 微信开放文档 HBuilderX-高效极客技巧 你要是uniapp开发的就这个HB编译器打开项目 运行 ...
- Java基础篇-笔记 p1-p75
Java 从这里启航 文章目录 Java 从这里启航 @[TOC] 常见的 DOS 命令 首先进入运行窗口 (快捷键 win + R) 查看目录下的内容 文件夹操作 Java 语言特点 Java 的术 ...
- web-Vue.js基础学习笔记
文章目录 初识Vue.js 概念 官网介绍 学习 生态系统 团队 资源列表 Vue的两个特点 数据驱动 组件化开发 架构模型-MVVM 入门示例 两个小提示 vue基本使用 Vue.js中的this ...
- java入门 慕路径,Java入门基础知识总结学习教程大全【必看经典】
类型的表达式,是循环条件,表达式3是党执行了一遍循环之后,修改控制循环的变量值. ??? for语句的执行过程是这样的:首先计算表达式1,完成必要的初始化工作:然后判断表达式2的值,如果表达式的值为t ...
- 提交表单自动刷新_Web自动化测试:元素的基础操作和浏览器基础操作
上一节,我们了解了如何定位元素,其实也有涉及对于元素的操作,这一节我们就详细的介绍一下对于元素的操作和对于浏览器的一些操作 一.对于元素的基础操作: clear():清除输入框内的文本 send_ke ...
- java mybatis基础
java mybatis基础 1.1 什么是mybatis? mybatis是一个优秀的持久层框架. 避免几乎所有的JDBC代码和手动设置参数以及获取结果集的过程. 可以使用简单的xml或者注解来配置 ...
最新文章
- c语言程序设计课件数组,第五章 数组_《C语言程序设计(Visual C++ 6.0环境)》电子教案_ppt_大学课件预览_高等教育资讯网...
- 高效办公,如何利用Python自动发送邮件
- hive底层原理 sql执行过程_Hive mapreduce SQL实现原理——SQL最终分解为MR任务,而group by在MR里和单词统计MR没有区别了-阿里云开发者社区...
- linux apache2 伪静态,linux Ubuntu apache2 伪静态设置
- 九十五、轻松搞定Python中的Excel办公自动化系列
- 关于 lockfree 算法
- java数据库编程——执行查询操作(一)
- 小学计算机管理,小学计算机室管理制度
- 循环冗余检错码CRC
- 想要导航提示页_如何优化网站导航呢?
- java9之后,String为何从char类型数组转成byte类型数组
- 数论入门符号_大o符号快速入门
- 绿坝即将登场,好戏就要开演
- 根据经纬度查询位置百度api
- 标准误(Standard Error)
- 六级单词词汇表(有注音)
- 数据可视化_科学统计图表5——ggplot绘制南丁格尔玫瑰图
- [ecshop 资料] ecshop 手机 自动识别 ua 自动跳转到手机版本 miqinew ecmoban
- Base64-encoded key bytes may only be specified for HMAC signatures.
- xv6 CPU alarm
热门文章
- codewar 代码练习2——7级晋升6级
- 全球参考系统(WRS)概述及常用工具汇总
- 调侃 亚马逊的 kindlegen
- Linux7.4环境安装git(腾讯云服务器)
- 2019.11德国IT新闻回顾
- 一、h3c交换机配置练习(一)
- C++(数据结构与算法):60---分而治之、分而治之应用(残缺棋盘、归并排序、快速排序、选择问题、相距最近的点对)、分而治之解递归方程、复杂度的下限
- Arthas 反手就是一顿操作
- 内存取证大纲(文件后缀mem)【volatility】【WRR】
- 2022-2028年中国多功能电动护理床行业市场发展潜力及投资风险预测报告