自描述C++部分面試題集

進擊的小堯好程式設計師發表於2020-07-05

1、談談啥叫物件成員以及物件成員的建構函式呼叫呼叫方式。

在類中定義的資料成員一般都是基本的資料型別。但是類中的成員也可以是物件,叫做物件成員。

C++中對物件的初始化時非常重要的操作,當建立一個物件的適合,C++編譯器必須確保呼叫了所有子物件的建構函式。如果所有的子物件有預設建構函式,編譯器可以自動呼叫他們。但是如果子物件沒有預設的建構函式,或者想指定呼叫某個建構函式怎麼辦?

那麼是福哦可以在類的建構函式直接呼叫子類的屬性完成初始化呢,但是如果子類的成員屬性時私有的,我們是沒有辦法訪問並完成初始化。

解決方法,對於子類呼叫建構函式,C++為此提供了專門的語法,即建構函式初始化列表,就當呼叫建構函式時,首先按各物件在類定義中的順序(和引數淚飆的順序無關)依次呼叫它們的建構函式,對這些物件初始化,最後再呼叫本身的函式體。也就是說,先呼叫物件成員的建構函式,再呼叫本身的建構函式,解構函式和建構函式呼叫順序相反,先構造,後析構。

 

2、談談對explicit的理解

C++提供了關鍵字explicit,禁止通過建構函式進行的隱式轉換,宣告explicit的建構函式不能在飲食隱式轉換中使用。

 

3、談談C中malloc free 與C++中的new delete有啥區別,或則C++在堆區申請物件時為啥推薦使用new delete

C++中的malloc free的問題:

1、程式設計師必須確定物件的長度。

2、malloc 返回一個void指標,C++不允許將void賦值給其他任何指標,必須強轉。

3、malloc 可能申請記憶體失敗,所以必須判斷返回值來確保記憶體分配成功。

4、使用者在使用物件之前必須記住對他初始化,建構函式不能顯示呼叫初始化(建構函式是由編譯器呼叫),使用者有可能忘記呼叫初始化。

總結:C的動態記憶體分配函式太複雜,容易令人混淆,是不可接受的,C++中我們推薦使用運算子new 和 delete

new 操作符 能確定在呼叫建構函式初始化之前記憶體分配時成功的,所有不用顯示確定呼叫是否成功。

delete表示式先呼叫解構函式,然後釋放記憶體。

 

4、談談你對static靜態成員變數的理解。

在一個類中,若將一個物件變數宣告為tatic,這種成員成為靜態成員變數。與一般的資料成員不同,無論建立了多少個變數,都只有一個靜態資料的拷貝,靜態成員變數屬於某個類,所有物件共享。

靜態變數,時在編譯階段就分配空間,物件還沒有建立時,就已經分配空間.

注意:1、靜態成員 變數必須在類中宣告,在類外定義。2、靜態資料成員不屬於某個物件,在得物件分配空間中不包括偶靜態成員所佔空間。3、靜態資料成員可以通過類名或者物件名來引用。

 

5、談談你對static靜態成員函式的理解

在類定義中,前面有static說明的成員函式成為靜態恆源函式,靜態成員函式使用方式和靜態靜態變數一樣,同樣在物件沒有建立前,即可通過類名呼叫。靜態成員函式主要為了訪問靜態變數,但是,不能訪問普通成員變數。

靜態成員函式的意義,不在於資訊共享,資料溝通,而在於管理靜態資料成員,完全對靜態資料成員的封裝/

1\靜態成員函式只能訪問靜態變數,不能訪問普通成員變數,2、靜態成員函式的使用和靜態成員變數一樣。3、靜態成員函式也有訪問許可權。4、普通成員函式可訪問靜態成員變數、也可以訪問非靜態成員變數。

 

6、談談你對this的理解。

成員函式通過this指標即可知道操作的是那個物件的資料,This指標是一種隱含指標,,它隱含於每個類的非靜態成員函式中,This指標無需定義,直接使用即可。

注意:靜態成員函式內部沒有this指標,靜態成員函式不能操作非靜態成員變數。

 

7、談談你對友元的理解

類的主要特點之一是資料因此,即類的室友成員無法在類的外部(作用域之外)訪問,但是,有適合需要在類的外部訪問類的私有成員,怎麼辦?解決方法是使用友元函式,友元函式是一種特權函式,C++允許這個特權函式訪問私有成員。

1、friend關鍵字只出現在宣告處。2、其他類、類成員函式、全域性函式都可宣告為友元。3、友元函式不是類的成員,不帶this指標。4、友元函式可訪問物件任意成員屬性,包括私有屬性。

友元注意事項:

1、友元關係不能被繼承。2、友元關係是單向的,類A是類B的朋友,但類B不一定是類A的朋友。

3、友元關係不具有傳遞性。類B是類A的朋友,類C是類B的朋友,但類C不一定是類A的朋友。

 

8、談談你對繼承的理解

C++最重要的特徵是程式碼重用,通過繼承機制可以利用已有的資料型別來定義新的資料型別,新的類不僅擁有舊類的成員,還擁有新定義的成員。

 

9、談談繼承中的鉤爪與析構的順序

1、子類物件在建立時會首先呼叫父類的建構函式。2、父類建構函式執行完畢後,才會呼叫子類的建構函式。

3、當父類建構函式有引數時,需要在子類初始化列表(引數列表)中顯示呼叫父類建構函式,解構函式呼叫順序和建構函式相反。

 

10、繼承中同名成員的處理方法

1、當子類成員和父類成員同名時,子類依然從父類繼承同名成員。2、如果子類有成員和父類同名,子類訪問其成員預設訪問子類的成員(本作用域,就近原則)3、在子類通過作用域::進行同名成員區分(在派生類中使用基類的同名成員,顯示使用類名限定符)。

 

11、C++的動態捆綁機制是怎樣的

首先,我們看看編譯器如何處理虛擬函式,當編譯器發現我們的類中有虛擬函式的時候,編譯器會建立一張虛擬函式表,把虛擬函式的函式入口地址放到虛擬函式中,並且在類中祕密增加一個指標,這個指標就是vpointer(縮寫vptr),這個指標是指向物件的虛擬函式表。在多型呼叫的時候,根據vptr指標,找到虛擬函式表來實現動態繫結。

 

相關文章