C++模板使用介绍
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");
}
最后结果显示:
4.非类型模版参数
一般来说,非类型模板参数可以是常整数(包括枚举)或者指向外部链接对象的指针。
那么就是说,浮点数是不行的,指向内部链接对象的指针是不行的。
template typename T, int MAXSIZE
class Stack{
Private:
T elems[MAXSIZE];
…
};
Int main()
{
Stack int, 20 int20Stack;
Stack int, 40 int40Stack;
…
};
![](https://yqfile.alicdn.com/img_64699a7ff113523d16d29397f1968281.jpg)
![](https://yqfile.alicdn.com/img_639c277a903ae5f30032e6d01323c87b.jpg)
C++模板和泛型编程详解 C++中的模板和泛型编程是非常重要的概念。模板是一种将数据类型作为参数的通用程序设计方法。它们允许开发人员编写可以处理各种数据类型的代码,而无需为每种数据类型编写不同的代码。下面介绍了一些关于C++中模板和泛型编程的重要知识点
【C++初阶】十三、模板进阶(总) 一、非类型模板参数 二、模板的特化 2.1 模板特化概念 2.2 函数模板特化 2.3 类模板特化 2.3.1 全特化 2.3.2 偏特化 三、模板分离编译 四、模板总结(优缺点)
【C++初阶】四、模板初阶 一、泛型编程 二、函数模板 2.1 函数模板概念 2.1 函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5 模板参数的匹配原则 2.6 函数模板不支持定义和声明分离 三、类模板 3.1 类模板的定义格式 3.2 类模板的实例化
C++【模板初阶】 早在北宋年间,中国的毕昇就已经发明了泥活字,标志着四大发明之一的活字印刷术正式诞生,从此文化传播取得了革命性突破,各种文学作品得以走进千家万户。倘若这项技术还没有被发明,那么恐怕我们现在的书本都还得靠逐字手抄传播,效率是非常低的 我们的程序也是如此,很多需要频繁使用的函数每次都得手动写,这可难不倒程序员,于是在上世纪80年代末,范型编程思想正式诞生,它就像是印刷文字的模具,将程序主体刻在其中,需要使用时让编译器根据参数类型生成即可,这就是我们今天的主角模板
相关文章
- C++模板之可变模板参数
- C++ String
- C++模板实现的AVL树
- C++类模板——博客链接
- 【C++】模板
- 34 C++ - 自增自减(++/--)运算符重载
- 60 C++ - 类模板的应用
- 55 C++ - 指向类成员的指针
- c++模板的简单认识
- 【C++初阶】函数模板与类模板
- 多线程 用户级线程和内核级线程 from C++多核高级编程
- 《C++并发编程实战》——1.3 在C++中使用并发和多线程
- 《C++编程风格(修订版)》——3.6 模板
- 《C++ Templates中文版》导读
- 《C++编程惯用法——高级程序员常用方法和技巧》——2.1 构造函数
- 【C++】关于C++模板的分离编译问题
- 基于QT(C++)实现加、减、乘、除括号混合运算计算器【100010627】
- 基于C++实现多核平台下的并行计算课程实验【100010519】
- 基于QT(C++)+Mysql实现的带GUI的图书管理系统【100010047】
- C++装饰者模式
- C++中的类模板详细讲述
- 【C++】函数模板&类模板
- C++类模板的声明和定义为什么要放在同一个文件
- C++11学习
- C++中模板使用详解
- 标准C++ I/O库 迭代器让数据自由流动 V8
- C++学习笔记12-模板1
- C++一个简单的手柄类模板
- C++编译器模板机制剖析
- C++ and Java template class and function 模板类和模板函数
- C++ 手写一个WebServer
- 编程参考 - C/C++中的方便调试使用的内置宏
- C++虚函数实现原理