博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++类模板
阅读量:5760 次
发布时间:2019-06-18

本文共 2326 字,大约阅读时间需要 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; Stack
stringStack; 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();}

 

你可能感兴趣的文章
TCP&UDP压力测试工具
查看>>
oracle 导入数据
查看>>
Android 最简单的自定义Dialog之一
查看>>
磨刀不误砍柴 - 配置适合工作学习的桌面环境
查看>>
redux v3.7.2源码解读与学习之 applyMiddleware
查看>>
【React】为什么我不再使用setState?
查看>>
Git原理与高级使用(3)
查看>>
从JDK源码看Writer
查看>>
Express 结合 Webpack 实现HMRwi
查看>>
基于protobuf的RPC实现
查看>>
我的友情链接
查看>>
HAProxy负载均衡原理及企业级实例部署haproxy集群
查看>>
开源中国动弹客户端实践(三)
查看>>
Win 8创造颠覆性体验:预览版关键更新
查看>>
vim在多文件中复制粘贴内容
查看>>
Android ContentObserver
查看>>
文章“关于架构优化和设计,架构师必须知道的事情”
查看>>
疯狂java学习笔记1002---非静态内部类
查看>>
ISA2006实战系列之一:实战ISA三种客户端部署方案(上)
查看>>
TCP服务器
查看>>