1.类模板与模板类的概念
⑴
什么是类模板 一个类模板(也称为类属类或类生成类)允许用户为类定义一种模式,使得类中的某些数据成员、默写成员函数的参数、某些成员函数的返回值,能够取任意类型(包括系统预定义的和用户自定义的)。
如果一个类中数据成员的数据类型不能确定,或者是某个成员函数的参数或返回值的类型不能确定,就必须将此类声明为模板,它的存在不是代表一个具体的、实际的类,而是代表着一类类。
⑵
类模板定义 定义一个类模板,一般有两方面的内容:
A.
首先要定义类,其格式为:
template <class T>
class foo
{
……
}
foo 为类名,在类定义体中,如采用通用数据类型的成员,函数参数的前面需加上T,其中通用类型T可以作为普通成员变量的类型,还可以作为const和static成员变量以及成员函数的参数和返回类型之用。例如:
template<class T>
class Test{
private:
T n;
const
T i;
static
T cnt;
public:
Test():i(0){}
Test(T k);
~Test(){}
void print();
T operator+(T x);
};
B.
在类定义体外定义成员函数时,若此成员函数中有模板参数存在,则除了需要和一般类的体外定义成员函数一样的定义外,还需在函数体外进行模板声明
例如
template<class T>
void Test<T>::print(){
std::cout<<"n="<<n<<std::endl;
std::cout<<"i="<<i<<std::endl;
std::cout<<"cnt="<<cnt<<std::endl;
}
如果函数是以通用类型为返回类型,则要在函数名前的类名后缀上“<T>”。例如:
template<class T>
Test<T>::Test(T k):i(k){n=k;cnt++;}
template<class T>
T Test<T>::operator+(T
x){
return n + x;
}
C.
在类定义体外初始化const成员和static成员变量的做法和普通类体外初始化const成员和static成员变量的做法基本上是一样的,唯一的区别是需在对模板进行声明,例如
template<class T>
int Test<T>::cnt=0;
template<class T>
Test<T>::Test(T k):i(k){n=k;cnt++;}
⑶
类模板的使用 类模板的使用实际上是将类模板实例化成一个具体的类,它的格式为:类名<实际的类型>。
模板类是类模板实例化后的一个产物。说个形象点的例子吧。我把类模板比作一个做饼干同的模子,而模板类就是用这个模子做出来的饼干,至于这个饼干是什么味道的就要看你自己在实例化时用的是什么材料了,你可以做巧克力饼干,也可以做豆沙饼干,这些饼干的除了材料不一样外,其他的东西都是一样的了。
2.类模板的派生
可以从类模板派生出新的类,既可以派生类模板,也可以派生非模板类。派生方法:
⑴ 从类模板派生类模板可以从类模板派生出新的类模板,它的派生格式如下例所示:
template <class T>
class base
{
……
};
template <class T>
class derive:public base<T>
{
……
};
与一般的类派生定义相似,只是在指出它的基类时要缀上模板参数,即base<T>。
⑵ 从类模板派生非模板类 可以从类模板派生出非模板类,在派生中,作为非模板类的基类,必须是类模板实例化后的模板类,并且在定义派生类前不需要模板声明语句:template<class>。例如:
template <class T>
class base
{
……
};
class derive:public base<int>
{
……
};
在定义derive类时,base已实例化成了int型的模板类。
源文档 <http://blog.csdn.net/justin12zhu/archive/2009/02/15/3893422.aspx>
分享到:
相关推荐
该笔记是我在mooc上看C++程序设计时做的一些笔记,因为是突发学习C++,要什么就学习什么,现在已经学到“文件输入输出流”,因为现在的项目不需要用到模板的知识,所以暂时只学到这么多,之后肯定还得学的,这个老师...
关于学习C++《STL模板库》以及学习《STL源码剖析》的学习笔记。
Boost 模板元编程学习笔记(二),开始你模板元编程的历程。C++,模板,标准库,元编程,教程,笔记
C++学习笔记和常见面试知识点,C++11特性,包括多态、虚表、移动语义、友元函数、符号重载、完美转发、智能指针、const和static、数组指针和指针数组、struct内存对齐、enum和union关键字等等。帮助了解C++的特性,...
数据结构与算法分析学习笔记(C++)chm 排版很好,代码直接能用,大牛写的,模板运用的很好
欢迎来到我的个人C++学习笔记!这是我在学习C++编程语言过程中的记录和心得分享。我希望这些笔记能够帮助那些刚开始接触C++的新手们理解基本概念、语法规则以及编程技巧。 在这里,您会找到从基础语法到高级特性的...
C++学习笔记,基础知识和后边的高级部分,类,模板,异常等都有。
P167~184C++类和函数模板学习笔记.docx
C++学习总结(真正的思考总结),包含面向对象思想的理解、模板编程与其他小窍门(有涉及C++11新特性)
一、C++语言语法基础(6) 二、数据结构和算法 三、模板和STL 四、阶段项目
第八章函数探幽 内联函数 默认参数 函数重载 函数模板
opencv教程个人学习笔记总结及C++示例.zip
标准模板库(STL)学习笔记,以STL容器list为例,学习C++标准模板库及其算法之for_each()、count()、count_if()。
或是学习源码时遇到模板黑魔法不得其解,或是见他人轻松把玩模板心生羡慕,或是希望无限逼近精通 C++ 的状态,C++ 爱好者对模板求知若渴却又望而生畏。分享该笔记,希望帮助更多 C++ 爱好者掌握模板的使用。 相关...
模板编程和标准模板库的笔记,如果了解了数据结构,看这个文档就如鱼得水!
本文件是C++提高部分的学习笔记,主要是针对C++模板、STL容器、函数和常用算法做详细的讲解,探讨C++更深层的使用。
非常简洁明了的数据结构参考源码,基于C++模板类封装,稍加修改可以用于实际项目中
C++中数组很坑,有没有类似Python中list的数据类型呢?类似的就是vector! vector 是同一种类型的对象的集合 ,每个对象都有一个对应的整数索引值。和 string 对象一样,标准库将负责管理与存储元素相关的内存。 ...
64位 VS2010 配置Boost库,这是学习Boost标准库开发的基础。