C++类模板
发布日期:2021-08-21 08:23:48
浏览次数:4
分类:技术文章
本文共 2328 字,大约阅读时间需要 7 分钟。
在上篇文章()中,主要介绍了C++中函数模板,与函数相似,类也可以被一种或多种类型参数化。容器类就是一个具有这种特性的典型的例子,
本文地址:,转载请注明源地址。
以下通过设计一个类模板Stack的实现来说明:
类模板Stack的实现
#include#include #include #include #include using namespace std;template class Stack{private: vector elems; //存储元素的容器public: void push(T const&); //压入元素 void pop(); //弹出元素 T top() const; //返回栈顶元素 bool empty() const { //返回栈是否为空 return elems.empty(); }};template void Stack ::push(T const& elem){ elems.push_back(elem);}template void Stack ::pop(){ if(elems.empty()) { throw out_of_range("Stack<>::pop(): empty stack"); } elems.pop_back();}template T Stack ::top() const{ if(elems.empty()) { throw out_of_range("Stack<>::top(): empty stack"); } return elems.back();}
可以发现,类模板Stack<>是通过C++标准库vector<>来实现的,我们可以不需要亲自设计内存管理、拷贝构造函数和赋值运算
类模板Stack的使用
为了使用类模板对象,必须显式地指定模板实参,下面的例子展示了如何使用类模板Stack<>:
int main(){ try{ Stack intStack; StackstringStack; intStack.push(7); cout< <
通过声明类型Stack<int>,在类模板内部就可以用int实例化T。因此,intStack是一个创建自 Stack<int>的对象,它的元素存储于vector,且类型为int,类似,如果声明和使用Stack<string>将 会创建相应的对象。
对于类模板,成员函数只有在被使用的时候才被实例化。显然,这样可以节省时间和空间,另一个好处是:对于那些“未能提供所有成员函数中所有操作的”类型,你可以使用该类型来实例化类模板,只要对那些“未能提供某些操作的”成员函数,模板内部不使用就可以。
你可以像使用其他任何类型一样地使用实例化后的类模板类型(例如Stack<int>),只要它支持所调用的操作就可以:
void foo(Stack const& s){ Stack istack[10]; ...}
借助于typedef,可以方便的使用类模板:
typedef Stack IntStack;void foo(IntStack const& s){ IntStack istack[10]; ...}
类模板的特化
可以使用模板实参来特化类模板,和函数模板的重载类似,通过特化类模板,你可以优化基于某种特定类型的实现,或者克服某种特定类型在实例化类模板时所出现的不足。为了特化一个类,你必须在起始处声明一个template<>,接下来声明用来特化类模板的类型:
template<>class Stack{private: deque elems;public: void push(string const&); void pop(); string top() const; bool empty() const { return elems.empty(); }};void Stack ::push(string const& elem){ elems.push_back(elem);}void Stack ::pop(){ if(elems.empty()) { out_of_range("Stack ::pop(): empty stack"); } elems.pop_back();}string Stack ::top(){ if(elems.empty()) { out_of_range("Stack ::top(): empty stack"); } return elems.back();}
转载地址:https://blog.csdn.net/weixin_33713503/article/details/90657176 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2024年04月07日 22时59分01秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
squid 优化指南
2019-04-27
centos vnc配置笔记
2019-04-27
让Squid 显示本地时间
2019-04-27
linux mysql 命令 大全
2019-04-27
清除Squid缓存的小工具
2019-04-27
Varnish Cache 3.0.0安装
2019-04-27
2011年6月编程语言关注度排行
2019-04-27
Varnish使用小结
2019-04-27
千万级并发HAproxy均衡负载系统介绍
2019-04-27
什么是A记录、MX记录、CNAME记录
2019-04-27
MongoDB简介
2019-04-27
Varnish purges 缓存清除
2019-04-27
Linux下redis安装部署
2019-04-27
水平切分与垂直切分
2019-04-27
MySQL引擎
2019-04-27
MySQL下的NoSQL解决方案HandlerSocket
2019-04-27
Apache服务器下使用 ab 命令进行压力测试
2019-04-27
查看Firefox中的缓存
2019-04-27
http header头设置反向代理不缓存
2019-04-27
配置MySQL主从复制
2019-04-27