基礎知識點 | 1020_STL容器,dynamic_cast,重寫過載和volatile等知識點
1.字串函式
函式宣告:char *strcat ( char *desst, const char *src )
功能:連線字串,將 src 字串 拷貝到 dest 所指的字串尾
函式宣告:char *strcpy(char *dest, const char *src)
功能:複製字串,將 src 字串 複製賦值給 dest 所指的字串尾
2.STL container
序列容器:動態陣列vector,雙端佇列deque(本質是動態陣列加索引),連結串列list
關聯容器:set,map,multiset,multimap,bitset(叫bit_array更合適)。
容器介面卡:stack,queue,priority_queue。
關於迭代器:
關聯容器刪除當前的iterator,只會使當前的iterator失效,只要在erase前,遞增當前iterator即可。
序列式容器,刪除當前的iterator會使後面所有元素的iterator都失效。這是因為vetor, deque使用了連續分配的記憶體,刪除一個元素導致後面所有的元素會向前移動一個位置。不過erase方法可以返回下一個有效的iterator,list使用了不連續分配的記憶體,但它的erase方法也會返回下一個有效的iterator。
3.初始化
在C++中,類的靜態成員必須在類內宣告,在類外初始化,像下面這樣:
class A{ private: static int count ; // 類內宣告 }; int A::count = 0 ; // 類外初始化,不必再加static關鍵字
能在類中初始化的成員只有一種,那就是靜態常量成員。
class A{
private:
static const int count = 0; // 靜態常量成員可以在類內初始化
};
4.dynamic_cast 動態轉換
dynamic_cast<>用於C++類繼承多型間的轉換,分為:
-
子類向基類的向上轉型(Up Cast)
- 向上轉型其幾乎肯定是成功的,只需用將子類的指標或引用賦給基類的指標或引用即可,。
- 特殊情況:當處於多繼承的類層次結構和虛擬基類時(即菱形非虛擬繼承),upcast可能會有歧義。
-
基類向子類的向下轉型(Down Cast)
-
向下轉型不一定成功
-
dynamic_cast將一個基類物件指標(或引用)cast到繼承類指標,dynamic_cast會根據基類指標是否真正指向繼承類指標來做相應處理。
dynamic_cast涉及執行時類別檢查,如果繫結到引用或指標的物件不是目標型別的物件,則dynamic_cast失敗。如果是指標型別失敗,則dynamic_cast的返回結果為0,如果是引用型別的失敗,則丟擲一個bad_cast錯誤。
-
5.多型,重寫,過載
過載和重寫的區別:
-
過載(overload):在同一個類中,函式名相同,引數列表不同,編譯器會根據這些函式的不同引數列表,將同名的函式名稱做修飾,從而生成一些不同名稱的預處理函式,未體現多型。
-
重寫(override):也叫覆蓋,子類重新定義父類中有相同名稱相同引數的虛擬函式,主要是在繼承關係中出現的,被重寫的函式必須是virtual的,重寫函式的訪問修飾符可以不同,儘管virtual是private的,子類中重寫函式改為public,protected也可以,體現了多型。
多型分為兩類:
- 靜態多型: 函式過載 和 運算符過載屬於靜態多型,複用函式名
- 動態多型: 派生類和虛擬函式實現執行時多型
靜態多型和動態多型區別:
- 靜態多型的函式地址早繫結 - 編譯階段確定函式地址
- 動態多型的函式地址晚繫結 - 執行階段確定函式地址
6.volatile關鍵字
volatile 關鍵字用於阻止編譯器過度優化:
- 阻止編譯器為了提高速度將一個變數快取到暫存器內而不寫回(單次讀寫的原子性)
- 阻止編譯器調整操作 volatile 變數的指令順序(有序性)
- 保證了不同執行緒對這個變數進行操作時的可見性,即一個執行緒修改了某個變數的值,這新值對其他執行緒來說是立即可見的。(實現可見性)