C++ 类模板解读
来源:互联网 发布:python爬虫实例 编辑:程序博客网 时间:2024/05/29 18:35
转自:http://www.cppblog.com/cslover/archive/2013/09/27/203458.html
个人感觉非常完善,也很有帮助
1. 类模板概念
(1) 什么是类模板: 一个类模板允许用户为类定义一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值能够取任意类型(包括系统预定义的和用户自定义的)。
如果一个类中数据成员的数据类型不能确定,或者是某个成员函数的参数或返回值的类型不能确定,就必须将此类声明为模板,它的存在不是代表一个具体的、实际的类,而是代表着一类类。
(2)类模板定义 定义一个类模板:
A. 首先要定义类,其格式为:
2 class Test
3 {
4 ……
5 }
6
Test为类名,在类定义体中,如采用通用数据类型的成员,函数参数的前面需加上T,其中通用类型T可以作为普通成员变量的类型,还可以作为const和static成员变量以及成员函数的参数和返回类型之用。例如:
2 class TemplateBase
3 {
4 public:
5 TemplateBase();
6 TemplateBase(Type k);
7 ~TemplateBase();
8
9 void echo();
10 void print();
11 Type operator+(Type x);
12 private:
13 Type testA;
14 const Type cTestB;
15 static Type sTestC;
16 };
17
B. 在类定义体外定义成员函数时,若此成员函数中有模板参数存在,则除了需要和一般类的体外定义成员函数一样的定义外,还需在函数体外进行模板声明
如果函数是以通用类型为操作类型,则要在函数名前的类名后缀上“<T>”。例如:
2 void TemplateBase<Type>::print()
3 {
4 cout<<"testA"<<testA<<endl;
5 cout<<"cTestB"<<cTestB<<endl;
6 cout<<"sTestC"<<sTestC<<endl;
7 }
8
9 template<class Type>
10 Type TemplateBase<Type>::operator+(Type x)
11 {
12 return testA + x;
13 }
14
C. 在类定义体外初始化const成员和static成员变量的做法和普通类体外初始化const成员和static成员变量的做法基本上是一样的,唯一的区别是需在对模板进行声明,例如:
2 TemplateBase<Type>::TemplateBase(Type k):cTestB(k)
3 {
4 testA = k;
5 }
6
7 template<class Type>
8 Type TemplateBase<Type>::sTestC = 5;
9
⑶ 类模板的使用 类模板的使用实际上是将类模板实例化成一个具体的类,它的格式为:类名<实际的类型>。
模板类是类模板实例化后的一个产物。把类模板比作一个做饼干的模子,而模板类就是用这个模子做出来的饼干,至于这个饼干是什么味道的就要看你自己在实例化时用的是什么材料了,你可以做巧克力饼干,也可以做豆沙饼干,这些饼干的除了材料不一样外,其他的东西都是一样的了(借鉴)。
1. 类模板的派生
可以从类模板派生出新的类,既可以派生类模板,也可以派生非模板类。派生方法:
⑴ 从类模板派生类模板可以从类模板派生出新的类模板,派生格式:
2 class Test
3 {
4 ……
5 }
6 template <class T>
7 class derive:public base<T>
8 {
9 ……
10 };
11
与一般的类派生定义相似,只是在指出它的基类时要缀上模板参数,即base<T>。
⑵ 从类模板派生非模板类 可以从类模板派生出非模板类,在派生中,作为非模板类的基类,必须是类模板实例化后的模板类,并且在定义派生类前不需要模板声明语句:template<class>。例如:
2 {
3 public:
4 DeriveFromTemplate(int val);
5 ~DeriveFromTemplate(void);
6 };
7 DeriveFromTemplate::DeriveFromTemplate(int val):TemplateBase<int>(val)
8 {
9 cout<<"Derive Construct"<<endl;
10 }
11 DeriveFromTemplate::~DeriveFromTemplate()
12 {
13 cout<<"Derive Destruct"<<endl;
14 }
15
在定义derive类时,base已实例化成了int型的模板类。
类模板好处:
(1)它是类型无关的,因此具有很高的可复用性。
(2)它是平台无关的,可移植性
(3)可用于基本数据类型和自定义类型
- C++ 类模板解读
- 【c/c++】类模板
- 【C/C++】模板类
- 【c++】模板和模板类
- C/C++:函数模板与类模板
- [C/C++]模板函数与模板类
- 模板模式解读
- c++vector模板类
- c++vector模板类
- c++:类模板
- [C++]类模板
- C++:类模板
- 【c++】类模板
- C++stack模板类
- c++模板类解读STL源码最小模型
- 类模板与模板类(C++)
- C++,template,类模板和函数模板
- C++:函数模板、类模板及其特化
- git(1)--windows github 的使用
- [RK3288][Android6.0] U-boot显示模块部分流程小结
- 多线程优缺点
- 记录
- 1-Overview of HTTP
- C++ 类模板解读
- 简单功能代码记录本(2)
- C/C++求职宝典21个重点笔记(常考笔试面试点)
- 下载并启动paddle
- Android 应用程序进程启动过程源码分析
- 解决jquery中,使用append增加元素时,该元素的绑定监听事件失效的办法
- Android开发之反射与注解
- 数据结构之栈(C++)
- redis学习 第三章 5种数据类型----list类型