博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【c++ templates读书笔记】【2】类模板
阅读量:4980 次
发布时间:2019-06-12

本文共 3546 字,大约阅读时间需要 11 分钟。

1、类模板的声明

template 
class Stack{ ...}

2、在类模板内部,T可以像其他任何类型一样,用于声明成员变量和成员函数。

template 
class Stack{private: std::vector
elemes; // 存储元素的容器public: Stack(); // 构造函数 void Push(const T& e); // 压入元素 void Pop(); // 弹出元素 T Top() const; // 返回栈顶元素};

这个类的类型是Stack<T>,其中T是模板参数。

3、类模板具体例子

#include
#include
#include
using namespace std;template
class Stack{private: vector
vec;public: void push(T const& elem); void pop(); T top() const; bool empty() const{ return vec.empty(); }};template
void Stack
::push(T const& elem){ vec.push_back(elem);}template
void Stack
::pop(){ if (vec.empty()){ throw out_of_range("Stack<>::pop():empty stack"); } vec.pop_back();}template
T Stack
::top() const{ if (vec.empty()){ throw out_of_range("Stack<>::pop():empty stack"); } return vec.back();}int main(){ try{ Stack
istk; istk.push(7); istk.push(8); istk.push(9); cout << istk.top() << endl; istk.pop(); cout << istk.top() << endl; Stack
sstk; sstk.push("aaa"); sstk.push("bbb"); sstk.push("ccc"); cout << sstk.top() << endl; sstk.pop(); cout << sstk.top() << endl; } catch (exception const& ex){ cerr << "Exception:" << ex.what() << endl; return EXIT_FAILURE; } system("pause"); return 0;}

对于类模板,成员函数只有被调用的时候才被实例化。如果类模板中含有静态成员,那么用来实例化的每种类型,都会实例化静态成员。

4、类模板的特化

为了特化一个类模板,要在起始处声明一个template<>.接下来声明用来特化模版的类型,这个类型被用作模版实参。

//类模板的特化template<>class Stack
{private: deque
deq;public: void push(string const& elem); void pop(); string top() const; bool empty() const{ return deq.empty(); }};void Stack
::push(string const& elem){ deq.push_back(elem);}void Stack
::pop(){ if (deq.empty()){ throw out_of_range("Stack<>::pop():empty stack"); } deq.pop_back();}string Stack
::top() const{ if (deq.empty()){ throw out_of_range("Stack<>::pop():empty stack"); } cout << "模板的特化:"; return deq.back();}

5、局部特化

template
class MyClass{ ...};// 局部特化,两个模板参数类型相同template
class MyClass
{ ...};// 局部特化,第2个模板参数是inttemplate
class MyClass
{ ...};// 局部特化,两个模板参数都是指针类型template
class MyClass
{ ...};

6、缺省模板实参

可以为类模板的参数定义缺省值,这些值被称为缺省模板实参,还可以引用之前的模板参数。

下面例子中的vector<T>就是缺省模板实参

#include
#include
#include
#include
using namespace std;template
>class Stack{private: Container container;public: void push(T const& elem); void pop(); T top() const; bool empty() const{ return container.empty(); }};template
void Stack
::push(T const& elem){ container.push_back(elem);}template
void Stack
::pop(){ if (container.empty()){ throw out_of_range("Stack<>::pop():empty stack"); } container.pop_back();}template
T Stack
::top() const{ if (container.empty()){ throw out_of_range("Stack<>::pop():empty stack"); } return container.back();}int main(){ try{ Stack
istk; istk.push(7); istk.push(8); istk.push(9); cout << istk.top() << endl; istk.pop(); cout << istk.top() << endl; Stack
> sstk; sstk.push("aaa"); sstk.push("bbb"); sstk.push("ccc"); cout << sstk.top() << endl; sstk.pop(); cout << sstk.top() << endl; } catch (exception const& ex){ cerr << "Exception:" << ex.what() << endl; return EXIT_FAILURE; } system("pause"); return 0;}

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/ruan875417/p/4921347.html

你可能感兴趣的文章