2.类模板与操作符重载

2015-10-22  本文已影响207人  偷天神猫

项目地址

C++类模板(1)

C++类模板(2)


const std::size_t DefaultStackSize = 1024;
template <typename T, std::size_t n = DefaultStackSize > class Stack {

public:
    void Push(const T const& element);
    int Pop(T& element);
    int Top(T& element) const;

private:
    std::vector<T> m_Members;
    std::size_t m_nMaxSize = n;
};

C++类模板(3)

C++类模板(4)


template <typename T, std::size_t n> class Stack
{
public:
    ...
    Stack(Stack<T, n> const&);                //copy constructor
    Stack<T>& operator = (Stack<T,n> const&); //assignment operator
}

C++类模板(5)


template <typename T, std::size_t nMaxSize>
void Stack<T, nMaxSize>::Push(const T const& element)
{
    if(m_Members.size() >= m_nMaxSize) {
        //error handing...
        return;
    }

    m_Members.push_back(element);
}

C++类模板(6)


template <typename T, std::size_t nMaxSize>
int Stack<T, nMaxSize>::Pop(T& element)
{
    if (m_Members.empty())
        return 0;

    element = m_Members.back(); //we have to first store the back element
    m_Members.pop_back();       //because pop_back of a vector removes
    return 1;                   //the last element but doesn't return it!
}

C++类模板(7)


template <typename T, std::size_t nMaxSize>
int Stack<T, nMaxSize>::GetTop(T& element) const
{
    if (m_Members.empty())
        return 0;

    element = m_Members.back();
    return 1;
}

C++类模板(8)

C++类模板(9)

C++类模板(10)


template <> class Stack<std::wstring> {

public:
    void SetStackSize(const std::size_t n) { m_nMaxSize = n; }//添加了一个新的成员函数
    std::size_t CurrentSize() const { return m_Members.size(); }

    void Push(const std::wstring const& element);
    int Pop(std::wstring& element);
    int GetTop(std::wstring& element) const;

private:
    std::size_t m_nMaxSize;
    std::list<std::wstring> m_Members;//采用list作为Stack的内部实现,取代了主模板中用vector实现的方式
}

C++类模板(11)

C++类模板(12)

使用 原型
MyClass<int, float> obj; MyClass<T1, T2> ————1
MyClass<float, float> MyClass<T, T> ————2
MyClass<float, int> MyClass<T, int> ————3
MyClass<int, float> MyClass<T1, T2> ————4
Usage Prototype
MyClass<int, int> obj; ERROR:matches MyClass<T, T> and MyClass<T, int>
MyClass<int, int> obj; ERROR:matches MyClass<T, T> and MyClass<T1, T2>

C++类模板(13)

C++类模板(14)


C++操作符重载(1)

C++操作符重载(2)


class ComplexType {
public:
    //non-static member
    ComplexType operator<(ComplexType&);

    //global functions
    friend ComplexType operator+(int, ComplexType&);
}

``
# C++操作符重载(3)

- 操作符重载的一般规则(续)
 - 一元操作符(Unary operator)如果声明为成员函数,则没有参数;如果声明为全局函数则有一个参数
 - 二元操作符(Binary operator)如果声明为成员函数,则有一个参数;如果声明为全局啊还是农户,则有两个参数
 - 如果一个操作符既能够用作一元操作,又能够用作二元操作(比如:&,*,+,-),则可以分别被重载
 - 操作符重载不能带有默认参数值
 - 除了operator=,所有其他操作符重载均可以被子类继承
上一篇下一篇

猜你喜欢

热点阅读