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;
…
};
相关推荐
一篇关于C++模板 设计模式 软件架构的文档,里面实现了一个泛化的命令模式和观察者模式
在C++中,矩阵快速幂可以通过模板实现,提高了计算效率。 矩阵概念 矩阵是指纵横排列的二维数据表格,同质上是一个m*n的二维数组。矩阵可以用于表示图像、信号处理、机器学习等领域的数据。矩阵乘法是矩阵运算的...
C++模板元编程 C++模板元编程是C++语言中的一种编程技术,它允许程序员在编译期生成代码,提高程序的执行效率和灵活性。C++模板元编程的核心是模板,模板是一种高级抽象机制,允许程序员在编译期生成代码。 C++...
本文旨在通过解析《浅谈C++容器》的内容,帮助读者深入了解C++容器的基本概念、分类及其背后的原理。 #### 二、容器的基本概念 容器是C++标准库中用于存储和管理数据的一种机制。它们提供了一种高效的方式来组织和...
C++容器是C++标准模板库中提供的一组通用的容器类,总共有10种,它们可以解决程序中遇到的许多问题。这些容器的实现都是基于数据结构的基本知识,它们是对数据结构的实例化。因此,了解数据结构的概念是非常重要的。...
在C++编程语言中,指针和引用是两种非常重要的概念,它们都允许我们间接访问内存中的对象。本文将深入探讨这两个主题,并通过实例来对比它们的使用方法和特性。 首先,指针是C++中的一种特殊类型,它存储的是一个...
模板是C++泛型编程的基础,一个模板就是一个创建类或函数的蓝图或者公式。 什么是模板 假定我们希望编写一个函数来比较两个值,并指出第一个值是小于、等于还是大于等于第二值。在实际中,我们可能想要定义多个函数...
QPointer模板类是QT对C++指针的一种增强,它可以检测并处理对象生命周期,防止野指针的出现。配合QObjectCleanupHandler,QT提供了自动垃圾回收机制,减少了内存泄漏的风险。 在性能方面,QT充分利用了C++的高效性...
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密...
在C++编程中,内存管理是一项关键技能,尤其是在涉及动态分配和变长数组时。本文将探讨C++的内存分配机制以及如何动态分配变长数组。 首先,C++中的内存分配有三种主要方式: 1. **静态存储区域分配**:这部分内存...
`std::function`模板类也是与lambda表达式密切相关的一个工具,它能将任何具有特定签名的函数(包括lambda表达式)封装成一个统一的类型,方便存储和传递。 总之,C++11的Lambda表达式提供了一种简洁、强大的方式来...
侯克林老师作为一位资深的C++教育者,他的课程资料深入浅出,深受学习者喜爱。这次分享的“houkelin 老师课件”正是他教学经验的结晶,包含了STL(标准模板库)、指针操作以及内存管理等核心知识点。 首先,我们来...
因此,如果需要与C++代码交互,C++程序员必须提供符合C语言调用约定的接口,且不能使用类、重载函数、模板和C++异常。此外,ctypes对Python的数据类型如list和set的自动转换支持不是很好,可能需要额外的Python代码...
【梁岳传博士谈C++的发展】 在IT领域,C++作为一门强大的编程语言,一直以其高效、灵活性和面向对象的特性备受推崇。著名IT公司首席架构师梁岳传博士,以其深厚的C++造诣,深入浅出地探讨了C++的发展历程与未来趋势...
2. **浅谈Visual C++中的预编译.doc** 预编译(Preprocessor)是C++编译过程的一部分,它在实际编译之前处理源代码,如替换宏定义、处理条件编译指令等。Visual C++是Microsoft提供的C++开发工具,其预编译功能可能...
《C++程序设计语言》是一本经典的编程教材,由Bjarne Stroustrup编写,它深入浅出地介绍了C++语言的基本概念、语法和高级特性。这个压缩包包含的是一系列与课本配套的课后习题解答,由作者谈宇翔提供。尽管他指出...
`sizeof(string)`通常返回的是`std::string`类模板实例化后的大小,这个大小是固定的,因为它包含了指针和长度等固定成员的大小。 在G++编译器下,`std::string`可能只占4个字节,这通常是因为指针和长度信息都被...
C++标准库中的`<iostream>`是C++标准模板库的一部分,提供流操作,如`std::cout`。不同于旧的C++库中的`iostream.h`,`<iostream>`包含了模板支持,更符合现代C++的编程风格。 总的来说,良好的VC++工程文件组织有...
C++模板机制允许编写泛型代码,减少代码重复,提高代码复用性。利用模板,可以在不牺牲性能的情况下,避免不必要的强制类型转换,增强代码的类型安全性和可读性。 #### C语言学习中的变参处理 C语言支持可变参数...