您的位置:首页 > 编程语言 > C语言/C++

C++模板 推荐

2009-11-19 20:40 176 查看
本篇文章部分参考自互联网有关模板的解释,再经过自己实践及理解而写作出来。感谢互联网资料的帮助。

模板定义:
模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模板可以分为两类,一个是函数模板,另外一个是类模板。

模板实现的写作方法:
1.函数模板的写法
函数模板的一般形式如下:
Template <class 或者也可以用typename T>
返回类型 函数名(形参表)
{// 函数定义体 }
说明: template 是一个声明模板的关键字,表示声明一个模板关键字class 不能省略,如果类型形参多于一个 ,每个形参前都要加class < 类型 形参表> 可以包含基本数据类型可以包含类类型.
注意:每个模板函数前面都要加上“Template <class 或者也可以用typename T> ”这一行。
//在template语句与函数模板语句之间不允许有别的语句;
请看以下程序:
//mian.cpp
[align=left]#include <iostream> [/align]
[align=left]// 声明一个函数模版, 用来比较输入的两个相同数据类型的参数的大小,class 也可以被typename 代替, [/align]
[align=left]//T 可以被任何字母或者数字代替。 [/align]
[align=left]template <class T> [/align]
[align=left]T max(T &x,T &y)//主要必须是参数引用,不能是 T min(T x,T y)[/align]
[align=left]{ [/align]
[align=left] if (a>b)
{
return a;
}
return b;[/align]
[align=left]} [/align]
[align=left]void main( ) [/align]
[align=left]{ [/align]
[align=left] int i1 = 3,i2=5;
char c1='a',c2='b';
double d1=0.35,d2 = 0.2;

cout<<"for int最大的为:"<<max(i1,i2)<<endl;
cout<<"for char最大的为:"<<max(c1,c2)<<endl;
cout<<"for double最大的为:"<<max(d1,d2)<<endl;[/align]
[align=left][/align]
[align=left]} [/align]
[align=left] [/align]
2. 类模板的写法
定义一个类模板:
Template < class 或者也可以用typename T >
class 类名{

};
说明:其中,template 是声明各模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个。 每个前面要有class或typename,用逗号隔开
注意:每个模板类数前面都要加上“Template <class 或者也可以用typename T> 这一行。
[align=left]例如:定义一个类模板: [/align]
[align=left]// template.h
#paragm once[/align]
[align=left] [/align]
[align=left]template <typename T1,typename T2> [/align]
[align=left]class myClass{ [/align]
[align=left]private : [/align]
[align=left] T1 I; [/align]
[align=left] T2 J; [/align]
[align=left]public : [/align]
[align=left] myClass(T1 a, T2 b);//若成员函数中使用了模板,则此函数需要在类体外定义!!![/align]
[align=left] void show(); [/align]
[align=left]}; [/align]
[align=left] [/align]
[align=left]//构造函数[/align]
[align=left]template <typename T1,typename T2> [/align]
[align=left]myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b){} [/align]
[align=left] [/align]
[align=left]void show(); [/align]
[align=left]template <typename T1,typename T2> [/align]
[align=left]void myClass<T1,T2>::show() [/align]
[align=left]{ [/align]
[align=left] cout<<"I=" <<I<<", J=" <<J<<endl; [/align]
[align=left]} [/align]
[align=left] [/align]
[align=left]注意:每个模板类的成员函数前都必须加上模板声明template <typename T1,typename T2> ,然后接下来命名类似于普通类,但必须加上类参数myClass<T1,T2>[/align]
[align=left] [/align]
[align=left]// run.cpp [/align]
[align=left]#include "template.h"[/align]
[align=left]#include <iostream> [/align]
[align=left]using namespace std; [/align]
[align=left]void main() [/align]
[align=left]{ [/align]
[align=left]//什么一个类的对象类似于普通类对象声明,但必须实例化类模板参数,如:myClass<int ,int > ,其余的调用函数方法跟普通类一样[/align]
[align=left] [/align]
[align=left] myClass<int,int>class1(1,2);
class1.show();[/align]
[align=left] [/align]
[align=left] myClass<char,char>class2('a','b');
class2.show();[/align]
[align=left][/align]
[align=left]} [/align]
[align=left] [/align]
[align=left]3.非类型模版参数
[/align]

一般来说,非类型模板参数可以是常整数(包括枚举)或者指向外部链接对象的指针。
那么就是说,浮点数是不行的,指向内部链接对象的指针是不行的。

[align=left]template <typename T, int MAXSIZE> [/align]
[align=left]class Stack{ [/align]
[align=left]Private: [/align]
[align=left] T elems[MAXSIZE]; [/align]
[align=left]… [/align]
[align=left]}; [/align]
[align=left]Int main() [/align]
[align=left]{ [/align]
[align=left] Stack<int , 20> int20Stack; [/align]
[align=left] Stack<int , 40> int40Stack; [/align]
[align=left]… [/align]
};

注意:最主要是注意格式,特别是类模板 定义的格式 和 实例化类模板的格式 ,函数模板定义时参数用引用& !
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息