STL基礎知識
1、 C++的標準化過程始於1989年,於1997年底完成,最終標準與1998年9月公佈
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* ptr爲T類的靜態成員SubType和ptr之乘。
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++標準程序庫STL在namespace 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:用於向下類型轉換;