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

第16章 模板與泛型編程(11)

編輯:C++入門知識

16.4.5 成員模板

任意類(模板或非模板)可以擁有本身為類模板或函數模板的成員,這種成員稱為成員模板(member template),成員模板不能為虛。

1. 定義成員模板


template <class Type> 
class Queue{ 
public: 
    Queue():head(0), tail(0){} 
    Queue(const Queue &Q):head(0), tail(0) 
    {copy_elems(Q);} 
    Queue& operator=(const Queue&); 
    ~Queue(){destroy();} 
    Type& front() 
    {return head->item;} 
    const Type &front() const{return head->item;} 
    void push(const Type &); 
    void pop(); 
    bool empty() const 
    {return head==0;} 
    friend ostream &operator<< <Type>(ostream &os, const Queue<Type> &q); 
 
    template<class It> 
    Queue(It beg, It end):head(0), tail(0){copy_elems<It>(beg,end)} 
    template<class Iter> 
    void assign(Iter, Iter); 
private: 
    QueueItem<Type> *head; 
    QueueItem<Type> *tail; 
    void destroy(); 
    void copy_elems(const Queue&); 
    template <class Iter> 
    void copy_elems(Iter,Iter); 
}; 
template <class Type>
class Queue{
public:
 Queue():head(0), tail(0){}
 Queue(const Queue &Q):head(0), tail(0)
 {copy_elems(Q);}
 Queue& operator=(const Queue&);
 ~Queue(){destroy();}
 Type& front()
 {return head->item;}
 const Type &front() const{return head->item;}
 void push(const Type &);
 void pop();
 bool empty() const
 {return head==0;}
 friend ostream &operator<< <Type>(ostream &os, const Queue<Type> &q);

 template<class It>
 Queue(It beg, It end):head(0), tail(0){copy_elems<It>(beg,end)}
 template<class Iter>
 void assign(Iter, Iter);
private:
 QueueItem<Type> *head;
 QueueItem<Type> *tail;
 void destroy();
 void copy_elems(const Queue&);
 template <class Iter>
 void copy_elems(Iter,Iter);
};2. 在類外部定義成員模板

當在類模板作用域外部定義成員模板的時候,必須包含兩個模板形參表。


template<class Type> 
template<class Iter> 
void Queue<Type>::assign(Iter beg, Iter end){ 
    destroy(); 
    copy_elems(beg,end); 

template<class Type>
template<class Iter>
void Queue<Type>::assign(Iter beg, Iter end){
 destroy();
 copy_elems(beg,end);
}因為assign函數刪除現存容器中的成員,所以傳給assign函數的迭代器有必要引用不同容器中的元素。標准容器的assign成員和迭代器構造函數有相同的限制。

3. 成員模板遵循常規訪問控制

成員模板遵循與任意其他類成員一樣的訪問規則。

4. 成員模板和實例化

與其他成員一樣,成員模板只有在程序中使用時才實例化。成員模板有兩種模板形參:由類定義的和由成員模板本身定義的。類模板形參由調用函數的對象的類型確定,成員定義的模板形參的行為和普通函數模板一樣,這些形參都通過常規模板實參推斷而確定。

 摘自 xufei96的專欄
 

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