C++中模板使用详解

转自: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;
…};
复制代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458409.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯2016春招安全岗笔试题解析

腾讯2016春招安全岗笔试题解析 昨天&#xff08;4月2日&#xff09;晚上7:00到9:00做了腾讯春招安全岗的笔试题。下面解析一下&#xff1a; 题目解析 1 在生成随机数前用当前时间设置随机数种子应该是安全的。如果程序用固定的数产生随机数&#xff0c;其结果也是固定的。如果用…

网络请求数据解析时,判断数据是否为空

//判断是否为空 (BOOL)IsStringEmptyOrNull:(NSString *)str { if (!str) { // null object return true; }else if (str nil){ return true; }else { if ([str isKindOfClass:[NSNull class]]) { return true; …

VS项目属性的一些配置项的总结(持续增加。。。)

首先&#xff0c;解决方案和项目文件夹包含关系(c项目)&#xff1a; VS解决方案和各个项目文件夹以及解决方案和各个项目对应的配置文件包含关系&#xff1a;假设新建一个项目ssyy&#xff0c;解决方案起名fangan&#xff0c;注意解决方案包括项目&#xff0c;此时生成的最外层…

shell编程中date用法(转)

原文地址:http://blog.sina.com.cn/s/blog_61c006ea0100mgxe.html 1、date --help %% 输出%符号 a literal % %a 当前域的星期缩写 locale’s abbreviated weekday name (Sun..Sat) %A 当前域的星期全写 locale’s full weekday name, variable length (Sunday..Saturday) %b 当…

linux下搭建FTP服务器

LINUX FTP简单配置 FTP配置1、#vi /etc/vsftp/vsftpd.conf #主要配置几个关键的就可以 anonymous_enableNO #拒绝匿名访问 chroot_local_userYES #锁定用户目录&#xff0c…

微信正则表达式 iOS

#pragma mark - 微信号的正则表达式 微信账号仅支持6-20个字母、数字、下划线或减号&#xff0c;以字母开头 (BOOL)isWxNumber:(NSString *)WXNum{ NSString *passWordRegex "^[a-zA-Z][a-zA-Z0-9_-]{5,19}$"; NSPredicate *passWordPredicate [NSPredica…

子元素增加margin-top会增加给父元素的问题

假设我们有如下代码 <div id"father" style"height:400px;width:400px;background:#e4393c;">     <div id"child" style"background:green;height:100px;width:100px;margin-top:40px;"></div>   </div&g…

Python 关键字

from&#xff1a;https://blog.csdn.net/liang19890820/article/details/68488392简述 关键字是预先保留的标识符&#xff0c;每个关键字都有特殊的含义。编程语言众多&#xff0c;但每种语言都有相应的关键字&#xff0c;Python 也不例外&#xff0c;它自带了一个 keyword 模块…

Zend Studio使用教程之升级Zend Studio(1/3)

2019独角兽企业重金招聘Python工程师标准>>> Zend Studio是新一代的专业级智能PHP IDE&#xff0c;它旨在帮助开发人员提高工作效率&#xff0c;创造出高品质的PHP应用程序&#xff01;它包含了PHP开发所必须的部件&#xff0c;通过一整套的编辑、调试、分析、优化和…

身份证正则表达式

#pragma mark - 身份证的正则表达式 (BOOL)checkUserID:(NSString *)userID { //长度不为18的都排除掉 if (userID.length!18) { return NO; } //校验格式 NSString *regex2 "^(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d…

java中可重入锁的学习总结

2019独角兽企业重金招聘Python工程师标准>>> 经常看到网上的人说&#xff0c;可重入锁一词&#xff0c;但是总是没怎么了解&#xff0c;到底什么是可重入锁&#xff0c;一直是一个模糊的概念&#xff0c;下面来大致总结一下。 可重入锁&#xff1a;指的是同一个线程…

Oracle DB优化

http://www.jb51.net/article/77876.htm http://www.jb51.net/article/56881.htm http://danni505.blog.51cto.com/15547/1163711/ http://blog.csdn.net/giianhui/article/details/8172786转载于:https://www.cnblogs.com/diyunpeng/p/5132392.html

设置View单个圆角

#pragma mark - 设置View单个圆角 (void)addCornerWithView:(UIView *)aView type:(UIRectCorner)aCorners size:(CGSize)aSize { // 根据矩形画带圆角的曲线 UIBezierPath *maskPath [UIBezierPath bezierPathWithRoundedRect:aView.bounds byRoundingCorners:aCorn…

Python 数据类型

简述Python 中的每个值都有一个数据类型。在 Python 编程中&#xff0c;一切&#xff08;万物&#xff09;皆对象&#xff0c;数据类型实际上是类&#xff0c;变量是这些类的实例&#xff08;对象&#xff09;。简述数据类型Number数字String字符串List列表Tuple元组Set集合Dic…

基于用户投票的排名算法(一):Delicious和Hacker News

互联网的出现&#xff0c;意味着"信息大爆炸"。 用户担心的&#xff0c;不再是信息太少&#xff0c;而是信息太多。如何从大量信息之中&#xff0c;快速有效地找出最重要的内容&#xff0c;成了互联网的一大核心问题。 各种各样的排名算法&#xff0c;是目前过滤信息…

iOS 修改工程名

一两个月之前&#xff0c;公司要求将现在的项目&#xff08;发货端和接单端在一个项目里&#xff09;&#xff0c;拆分成两个项目分别是接单端项目和发货端项目&#xff0c;原有的项目还不能下架。这种情况就要考虑苹果审核查代码的重复率的问题了。老板的要求除了改变项目的主…

Windows 下 Python 环境搭建

简述Python 是跨平台的&#xff0c;可以运行在 Windows、Mac OS X 和各种 Linux/Unix 系统上。在学习 Python 之前&#xff0c;首先要搭建 Python 环境。完成后&#xff0c;会得到 Python 解释器&#xff08;负责运行 Python 程序的&#xff09;&#xff0c;一个命令行交互环境…

面试中关于Java你所需知道的的一切

本篇文章会对面试中常遇到的Java技术点进行全面深入的总结&#xff0c;帮助我们在面试中更加得心应手&#xff0c;不参加面试的同学也能够借此机会梳理一下自己的知识体系&#xff0c;进行查漏补缺。 1. Java中的原始数据类型都有哪些&#xff0c;它们的大小及对应的封装类是什…

利用BBRSACryptor实现iOS端的RSA加解密

背景 RSA这种非对称加密被广泛的运用于网络数据的传输&#xff0c;但其在iOS上很难直接实现&#xff0c;BBRSACryptor框架通过移植openssl实现了iOS端的RSA&#xff0c;本文将介绍如何使用BBRSACryptor生成证书&#xff0c;加载公钥&#xff0c;以及后端如何用php读取证书&…

UIView转UIimage

/** 将 UIView 转换成 UIImage param view 将要转换的View return 新生成的 UIImage 对象 */ - (UIImage *)yj_convertCreateImageWithUIView:(UIView *)view{ UIGraphicsBeginImageContext(view.bounds.size); CGContextRef ctx UIGraphicsGetCurrentContext…