程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ Primer 學習筆記_44_模板(二):類模板、非類型模板參數

C++ Primer 學習筆記_44_模板(二):類模板、非類型模板參數

編輯:C++入門知識

C++ Primer 學習筆記_44_模板(二):類模板、非類型模板參數


一、類模板

1、類模板:將類定義中的數據類型參數化,比如:vector, vector
2、類模板實際上是函數模板的推廣,可以用相同的類模板來組建任意類型的對象集合

(一)、類模板的定義

template <類型形參表>
class <類名>
{ //類說明體 };
template <類型形參表>
<返回類型> <類名> <類型名表>::<成員函數1>(形參表)
{ //成員函數定義體 }
template <類型形參表>
<返回類型> <類名> <類型名表>::<成員函數2>(形參表)
{ //成員函數定義體 }

template <類型形參表>
<返回類型> <類名> <類型名表>::<成員函數n>(形參表)
{ //成員函數定義體 }

 

(二)、使用類模板

類模板的實例化:用具體的數據類型替換模板的參數以得到具體的類(模板類)
模板類也可以實例化為對象
用下列方式創建類模板的實例:

類名 <類型實參表> 對象名稱;

\

對於函數模板與類模板,模板參數並不局限於類型(類類型,基本類型,模板類實例),普通值也可以作為模板參數

 

 

二、非類型模板參數template

對於函數模板與類模板,模板參數並不局限於類型,普通值也可以作為模板參數。

1、示例

Stack2.h:

 

#ifndef _STACK2_H_
#define _STACK2_H_

#include 

template 
class Stack2
{
public:
    Stack2();
    ~Stack2();

    void Push(const T &elem);
    void Pop();
    T &Top();
    const T &Top() const;
    bool Empty() const;
private:
    T *elems_;
    int top_;
};

template 
Stack2::Stack2() : top_(-1)
{
    elems_ = new T[MAX_SIZE];
}

template 
Stack2::~Stack2()
{
    delete[] elems_;
}

template 
void Stack2::Push(const T &elem)
{
    if (top_ + 1 >= MAX_SIZE)
        throw out_of_range("Stack2<>::Push() Stack2 full");

    elems_[++top_] = elem;
}

template 
void Stack2::Pop()
{
    if (top_ + 1 == 0)
        throw out_of_range("Stack2<>::Push() Stack2 empty");

    --top_;
}

template 
T &Stack2::Top()
{
    if (top_ + 1 == 0)
        throw out_of_range("Stack2<>::Push() Stack2 empty");

    return elems_[top_];
}

template 
const T &Stack2::Top() const
{
    if (top_ + 1 == 0)
        throw out_of_range("Stack2<>::Push() Stack2 empty");

    return elems_[top_];
}

template 
bool Stack2::Empty() const
{
    return top_ + 1 == 0;
}
#endif // _STACK2_H_

 

 

main.cpp:

 

#include "Stack2.h"
#include 
#include
using namespace std;

int main(void)
{
    Stack2 s;
    s.Push(1);
    s.Push(2);
    s.Push(3);

    while (!s.Empty())
    {
        cout << s.Top() << endl;
        s.Pop();
    }
    return 0;
}

 

\

參考:

C++ primer 第四版
Effective C++ 3rd
C++編程規范

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved