STL學習(一)

STL基礎知識

1、  C++的標準化過程始於1989年,於1997年底完成,最終標準與19989月公佈

2、  C++語言核心和C++程序庫是同時被標準化的。

3、  STL完全依賴模板Template

4、  模板的參數可以顯示或隱式傳遞

5、  函數模板

6、  類模板:有能力操控任意類型元素的容器

7、  模板的編譯問題

8、  模板的參數通常爲類型,但也可以爲非類型,如某個類型的實例

9、  模板參數也可以有缺省的參數

10、              typename關鍵字的使用

l         代替class關鍵字

l         聲明類型

 template <typename T>

 class MyClass

 {

       typename T::SubType* ptr;

       //…

 };

typename指出SubType T Class中定義的一種類型,即ptr是指向T::SubType類型的一個指針,如果不寫typename,編譯器就理解T::SubType* ptrT類的靜態成員SubTypeptr之乘。

11、              類的成員函數也可以爲模板,稱爲成員模板

如:

 class MyClass

 {

//…

 template<typename T>

 void f(T){/*…*/}

 //…

 };

一個重要的用途:提供自動類型轉換

如:

template<typename T>

class MyClass

 {

 private:

 T value;

 public:

 void assign(const MyClass<T>& x)

 {value=x.value;}

};

 //..

 void f()

{

MyClass<double> d;

MyClass<double> i;

d.assign(d);//ok

d.assign(i);//error!

}

assign函數修改成成員模板就可以了

template<typename T>

class MyClass

 {

 private:

 T value;

 public:

 template<typename X>

 void assign(const MyClass<X>& x)

 {value=x.GetValue();}

 T GetValue()

 {return value;}

};

我們可以稱此函數爲Template Constructor:常用於複製對象時實現隱式類型轉換。Template Constructor並不隱藏顯式的拷貝構造函數,如果類型完全吻合則使用顯式的拷貝構造函數。

12、              Nested Class嵌套的模板類

13、              基本數據類型的初始化

int i1;

int i2=int();

在模板中常使用

如:

template <typename T>

void f()

{

       T x=T();

}

14、               Namespace:命名空間是將不同的標識符號集合在一個具有名字的作用域內。命名空間是開放的,你可以在不同的模塊中定義和擴展命名空間。

使用時有兩種方法:使用using declaration ;使用using directive ,使用它後會使命名空間的所有名字暴光。

C++標準程序庫STLnamespace std中定義了它所用的標識符號

15、               explicit關鍵字:通過使用explicit關鍵字我們可以禁止“單參數構造函數”用戶自動類型轉換。

如:

class Stack

{

public:

explicit Stack(int Size)

{

//…

}

//…

};

//…

Stack x;

 x=40;//error

如果不用explicit修飾的話會生成有40個元素的空Stack對象並賦值給x

explicit關鍵字也阻絕以賦值語法進行帶有轉型操作的初始化

Stack s(40);

Stack s1=20;

16、              類型轉換

static_cast:代替常見的類型轉換;dynamic_cast:用於向下類型轉換;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章