1. 程式人生 > 其它 >基礎知識點 | 1020_STL容器,dynamic_cast,重寫過載和volatile等知識點

基礎知識點 | 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 關鍵字用於阻止編譯器過度優化:

  1. 阻止編譯器為了提高速度將一個變數快取到暫存器內而不寫回(單次讀寫的原子性)
  2. 阻止編譯器調整操作 volatile 變數的指令順序(有序性)
  3. 保證了不同執行緒對這個變數進行操作時的可見性,即一個執行緒修改了某個變數的值,這新值對其他執行緒來說是立即可見的。(實現可見性)