与函数模板类似地《C/C++编程笔记:C++模板详解(一)函数模板的概念和特性》(博主前两天发布的文章),类也可以被一种或多种类型参数化。例如,容器类就是一个具有这种特性的典型例子,它通常被用于管理某种特定类型的元素。只要使用类模板,我们就可以实现容器类,而不需要确定容器中元素的类型。
一、类模板的实现
在这篇博文中,我们使用Stack作为类模板的例子。
(1.1) 类模板的声明
如上所示,类模板的声明和函数模板的声明很相似:在声明之前,我们先声明参数类型的标识符
当然,也可以使用关键字class来代替typename。在类模板的内部,类型T可以像其它的类型一样,用于声明成员变量和成员函数。在这个例子中,类的类型是Stack<T>,其中T是模板参数。因此,当在声明中需要使用该类的类型时,我们必须要使用Stack<T>。例如,如果要声明自己实现的拷贝构造函数和赋值运算符,那就应该这样来编写:
然而, 当需要使用类名而不是类的类型时,就应该只用Stack。例如,当指定类的名称,或是需要编写构造函数、析构函数时,就需要使用Stack。
(1.2) 类模板的实现
为了定义类模板的成员函数,我们必须要指定该成员函数是一个函数模板(使用template<typename T>),而且还需要使用这个类模板的完整类型限定运算符Stack<T>::。因此,成员函数push的完整定义如下:
其它成员函数的实现也是类似的;和普通类定义相同,完全也可以将成员函数的实现内联地写在类中,例如:
二、类模板的使用
参见如下的main函数代码:
注意:只有那些被调用了的成员函数,才会产生这些函数的实例化代码。
所以,针对这个类模板,缺省的构造函数、push、top方法都针对int、std::string进行了实例化。然而,pop方法只提供了std::string的实例化。这样做的好处是:
(1)可以节省时间和空间。
(2)对于那些未能提供所有成员函数中所有操作的类型,也可以使用该类型来实例化类模板。
另一方面,如果类中含有静态成员,那么用来实例化的每种类型,都会实例化这些静态成员。
学习C/C++编程知识,想要成为一个更加优秀的程序员,或者你学习C/C++的时候有难度,可以来博主的C语言C++零基础编程学习圈,里面不仅有学习视频和文件资料,还有更多志同道合的朋友,欢迎转行也学习编程的伙伴,和大家一起交流成长会比自己琢磨更快哦!
微信公众号:C语言编程学习基地