模板编程——类模板

往期文章:模板编程——函数模板

模板概述

模板的意义是可以对类型进行参数化

相关关键字:templatetypenameclass

template用于定义模板,typenameclass用于定义模板类型参数 

示例代码

SeqStack类模板

// SeqStack类模板


#include
using namespace std;


// 定义SeqStack类模板
template
// T是模板类型参数
// 是模板参数列表,也可写成template
class SeqStack // SeqStack是函数模板名
{ // 顺序栈
public:
    // 类模板名SeqStack + 参数列表 = 类名SeqStack
    // 构造函数名和析构函数名可以不加参数列表

    // 普通构造函数
    SeqStack(int size = 10)
        :_pstack(new T[size]), // 初始化列表
        _top(0),
        _size(size)
        { }
    
    // 拷贝构造函数
    SeqStack(const SeqStack &stack)
        :_top(stack._top),
        _size(stack._size)
        {
            _pstack = new T[_size];

            for(int i = 0; i < _top; i ++)
            {
                _pstack[i] = stack._pstack[i];
                // 不使用memcpy()是为了防止出现浅拷贝
            }
        }
    
    // 析构函数
    ~SeqStack()
    {
        delete [] _pstack;
        _pstack = nullptr;
    }

    // 重载=
    SeqStack& operator=(const SeqStack& stack)
    {
        if(this == &stack) return *this;

        delete [] _pstack;

        _top = stack._top;
        _size = stack._size;
        _pstack = new T[_size];

        for(int i = 0; i < top; i ++)
        {
            _pstack[i] = stack._pstack[i];
            // 不使用memcpy()是为了防止出现浅拷贝
        }
    }

    // 入栈
    void push(const T &val)
    {
        if(full()) expand();
        _pstack[_top ++] = val;
    }

    // 出栈
    void pop()
    {
        if (empty()) return;
        _top -- ;
    }

    // 栈顶元素
    T top() const
    {
        if(empty()) throw "stack is empty!";
        return _pstack[_top - 1];
    }

    // 判满
    bool full() const   { return _top == _size; }
    // 判空
    bool empty() const  { return _top == 0; }


private:
    T * _pstack;
    int _top;
    int _size;

    // 2倍扩容
    void expand()
    {
        T * ptmp = new T[2 * _size];
        for(int i = 0; i < _top; i ++)
        {
            ptmp[i] = _pstack[i];
            // 不使用memcpy()是为了防止出现浅拷贝
        }

        delete [] _pstack;
        _pstack = ptmp;
        _size *= 2;
    }
};


int main()
{
    SeqStack s1;

    s1.push(10);  s1.push(20);  s1.push(30);
    while(! s1.empty())
    {
        cout << "top:" << s1.top() << endl;
        s1.pop();
    }
    cout << "--------------------------------------------------" << endl;
    
    SeqStack<> s2; // 默认T为int

    s1.push(40);  s1.push(50);  s1.push(60);
    while(! s1.empty())
    {
        cout << "top:" << s1.top() << endl;
        s1.pop();
    }
    cout << "--------------------------------------------------" << endl;

    return 0;
}

/*
top:30
top:20
top:10
--------------------------------------------------
top:60
top:50
top:40
--------------------------------------------------
*/

你可能感兴趣的:(C++,c++,类,模板)