C 面試基礎知識 C C 篇(一)

2021-09-10 01:35:39 字數 2071 閱讀 6295

1、成員變數在使用初始化列表初始化時,與建構函式中初始化成員列表的順序無關,只與定義成員變數的順序有關。因為成員變數的初始化次序是根據變數在記憶體中次序有關,而記憶體中的排列順序早在編譯期就根據變數的定義次序決定了。

2、如果不使用初始化列表初始化,在建構函式內初始化時,此時與成員變數在建構函式中的位置有關,即按著順序執行初始化語句。 

3、注意:類成員在定義時,是不能初始化的 

4、注意:類中const成員常量必須在建構函式初始化列表中初始化。 

5、注意:類中static成員變數,必須在類外初始化。 

6、靜態變數進行初始化順序是基類的靜態變數先初始化,然後是它的派生類。直到所有的靜態變數都被初始化。這裡需要注意全域性變數和靜態變數的初始化是不分次序的。這也不難理解,其實靜態變數和全域性變數都被放在公共記憶體區。可以把靜態變數理解為帶有「作用域」的全域性變數。在一切初始化工作結束後,main函式會被呼叫,如果某個類的建構函式被執行,那麼首先基類的成員變數會被初始化。

乙個總的初始化順序是這樣的:

1、基類的靜態變數或全域性變數

2、派生類的靜態變數或全域性變數

3、基類的成員變數

4、派生類的成員變數

1.static_cast------相關型別之間的轉換

使用場景:如在同一類層次結構中的乙個指標型別到另乙個指標型別,整型到列舉型別,或者浮點型到整型等。

例:  1    int m=10;

double n=static_cast < int > m;

2    int * q=static_cast < int* >(malloc(100));

2.reinterpret_cast------處理互不相關型別之間的轉換

使用場景:如從整型到指標,一種型別的指標到另一種型別的指標等

例: int a=10;

double* b=reinterpret_cast(a); //b的轉換結果為0x0000000a

3.dynamic_cast------處理基型別到派生型別的轉換(這個說法不是很準確,為了好理解先這麼寫)

使用場景:基類必須有虛函式,即為多型時,可以轉換

它可以將基類型別的指標或引用安全地轉換為派生型別的指標或引用。當具有基類的引用或指標,但需要執行不是基類組成部分的派生類操作的時候,需要動態的強制型別轉換。通常,從基類指標獲得派生類行為最好的方法是通過虛函式。當使用虛函式的時候,編譯器自動根據物件的實際型別選擇正確的函式。但是,在某些情況下,不可能使用虛函式。這時候就需要使用dynamic_cast關鍵字了。但是,能用虛函式還是用虛函式最好。

與其他強制型別轉換不同,dynamic_cast涉及執行時型別檢查。如果繫結到引用或指標的物件不是目標型別的物件,則dynamic_cast失敗。

例:

class base

//基類中存在虛函式,故在派生類中存在虛函式指標指向虛函式表。

};class derived:public base

};int main()

4.const_cast用來移除變數的const或volatile限定符。

使用const_cast會消除被轉換型別的const特性,而且只有const型別的變數才能使用。那麼,什麼情況下需要消除乙個const變數的const特性呢?比如,有時候有的函式的形參型別為非const型別,那麼如果你要將乙個const型別的引數傳入就會報錯。所以在這種情況下需要先使用const_cast轉化一下。

補充:在上面四個型別轉化關鍵字中,除了static_cast,其他的三個都有可能涉及到指標的型別轉換。從本質上來說,指標的型別不同,並沒有產生很大的差異,他們都是需要足夠的記憶體來存放乙個機器位址。「指向不同型別之各指標」間的差異,既不在其指標表示法不同,也不在其內容(代表乙個位址)不同,而是在其所定址出來的object不同。也就是說,「指標型別」會教導編譯器如何解釋某個特定位址中的記憶體內容及其大小。

所以,轉換(cast)其實是一種編譯器指令。大部分情況下它並不改變乙個指標所含的真正位址,它只影響「被指出之記憶體大小和其內容」的解釋方式。

C 面試基礎知識 C C 篇(二)

vector的元素排列和操作方式與array很相似,不同的是vector是動態空間,能夠隨著元素的新增自動擴充套件空間。它的實現關鍵在於對大小的控制以及重新配置空間時移動元素的效率。vector的iterator定義是value type 也就是普通的指標。因為vector維護的空間是乙個連續線性空...

C 基礎知識篇

1.命名空間 在c 中,識別符號 name 可以是符號常量 變數 巨集 函式 結構 列舉 類和物件等。為了避免在大規模程式設計中以及在程式設計師使用各種各樣的c 庫時,這些識別符號的命名發生衝突,標準c 引入了關鍵字namespace 命名空間 以便更好控制識別符號作用域。定義格式如下 namesp...

C C 基礎知識

c 基礎知識 定義在class宣告內的成員函式預設是inline函式 進製 問 假設在n進製下,等式 240 12 2880 成立,n值是 a 19 b 18 c 17 d 16 e 15 f 以上都對 答 2 n 2 4 n 1 1 n 2 2 n 3 8 n 2 8 n 1 化簡後為恒等式,故n...