C++類模板深入理解2
1、認識在Template中Typename和class關鍵詞。
在c++的Template中很多地方都用到了typename與class這兩個關鍵字,而且有時候二者可以替換,那麼是不是這兩個關鍵字完全一樣呢?事實上class用於定義類,在模板引入c++後,最初定義模板的方法爲:template<class T>,這裏class關鍵字表明T是一個類型,後來爲了避免class在這兩個地方的使用可能給人帶來混淆,所以引入了typename這個關鍵字,它的作用同class一樣表明後面的符號爲一個類型,這樣在定義模板的時候就可以使用下面的方式了:
template<typename T>.在模板定義語法中關鍵字class與typename的作用完全一樣。所以這原本是C++設計時沒有考慮的一個問題。
回到我們的正題,首先認識什麼是類模板?
(1)
什麼是類模板
一個類模板(也稱爲類屬類或類生成類)允許用戶爲類定義一種模式,使得類中的某些數據成員、默認成員函數的參數、某些成員函數的返回值,能夠取任意類型(包括系統預定義的和用戶自定義的)。
如果一個類中數據成員的數據類型不能確定,或者是某個成員函數的參數或返回值的類型不能確定,就必須將此類聲明爲模板,它的存在不是代表一個具體的、實際的類,而是代表着一類類。
template<typename T>
class A
{ public:
A(T t)
{ this->t= t;
}
T &getT( )
{ return t;
}
protected:
public:
T t;
};
void main()
{ //模板了中如果使用了構造函數,則遵守以前的類的構造函數的調用規則
A<int> a(100);
a.getT();
return;
}
2 繼承中的類模板
注意:子類從模板類繼承的時候,需要讓編譯器知道 父類的數據類型具體是什麼(數據類型的本質:固定大小內存塊的別名)A<int>
class B :public A<int>
{ public:
B(int i) : A<int>(i) //實例化基類抽象類型參數
{
}
void printB()
{ cout<<"A:"<<t<<endl;
}
protected:
private:
};