C 面試寶典 C 基礎知識

2021-10-07 14:12:31 字數 4612 閱讀 8577

1.c++和c的區別

設計思想上: c++是物件導向的語言,而c是面向過程的結構化程式設計語言

語法上:

c++具有封裝、繼承、多型三種特性

c++相比於c,增加多許多態別安全的功能,比如強制轉換

c++支援正規化,比如模板類、函式模板等

2.野指標是什麼?

3.說一下static關鍵字的作用?

1.全域性靜態變數

在全域性變數前加上關鍵字static,全域性變數就定義成乙個全域性靜態變數。

靜態儲存區,在整個程式執行期間一直存在。

初始化:未經初始化的全域性靜態變數會被自動初始化為0(自動物件的值是任意的)

作用域:全域性靜態變數在宣告他的檔案之外是不可見的,也就是從定義之處開始,到該檔案結束。

2.區域性靜態變數

在區域性變數之前加上關鍵字static,區域性變數就成為乙個區域性靜態變數

記憶體中的位置:靜態儲存區

初始化:未經初始化的的區域性靜態變數會被自動初始化為0

作用域:作用域仍為區域性作用域,當定義它的函式或者語句結束的時候,作用域結束。但是當區域性靜態變數離開作用域後,並沒有銷毀,而是仍然駐留在記憶體當中,只不過我們不能在對他進行訪問,直到該函式再次被呼叫,並且值不變。

3.靜態函式

在函式返回型別前加static,函式就定義為靜態函式。函式的定義預設是extern的,但靜態函式只是在宣告他的檔案當中可見,不能被其他檔案所用。

函式的實現使用static修飾,那麼這個函式只可在本cpp內使用,不會同其他cpp中同名函式引起衝突

4.類的靜態成員

在類中,靜態成員可以實現多個物件之間的資料共享,並且使用靜態資料成員還不會破壞隱藏的原則,即保證了安全性。因此,靜態成員是類的所有物件中共享的成員,而不是某個物件的成員。對多個物件來說,靜態資料成員之儲存一處,供所有物件共用。

5.類的靜態函式

靜態成員和靜態資料成員一樣,它們屬於類的靜態成員,他們都不是物件成員。因此,對靜態成員的引用不需要用物件名。

在靜態成員函式的實現中不能直接引用類中的說明的非靜態成員,可以引用類中說明的靜態成員。如果靜態成員要引用非靜態成員,可通過物件來引用。從中可以看出,呼叫靜態成員函式的使用如下格式:《類名》::《靜態成員函式名》

4.c/c++中指標和引用的區別?

定義:

引用:引用就是某一變數的別名,對引用的操作與變數直接操作完全一樣。

1.指標有自己的一塊空間,而引用只是乙個別名

2.使用sizeof指標大小是4,而引用則是被引用物件的大小

3.指標可以被初始化為null,而指標必須被初始化且必須是乙個已有的物件的引用

4.作為引數傳參時,指標需要被解引用才可以對物件進行操作,而直接對引用的修改都會改變引用所指向的物件

5.有coast指標,但是沒coast引用

6.指標在使用中可以指向其他物件,但是引用只能指向乙個物件的引用不能被改變

7.指標有多級指標,而引用只有一級

8.指標和引用使用++運算子的意義不一樣

9.如果返回動態記憶體分配的物件或者記憶體,必須使用指標,引用會引起記憶體洩漏

5.說一說c++中四種cast轉換

c++的四種轉換型別是:static_cast, dynamic_cast, const_cast, reinterpret_cast

1.const_cast

用於將const變數轉為非coast

2.static_cast

用於各種隱式轉換,比如非const轉const,void*轉指標,static_cast能用於多型向上轉化,如果向下轉能成功但是不安全,結果未知。

3.dynamic_cast

用於動態型別轉換。只能用於含有虛函式的類,用於類層次間的向上和向下轉化。只能轉指標或引用。向下轉化時,如果是非法的對於指標返回null,對於引用拋異常。

向上轉化:指的是子類向基類的轉化

向下轉化:指的是基類向子類的轉化

4.reinterpret_cast

幾乎什麼都能轉,比如int轉指標,但是容易出問題,盡量少用。

5.為什麼不使用c的強制轉換?

c的強制轉換看似什麼都能轉,但是轉化不夠明確,不能進行錯誤檢查,容易出錯。

6.請你說一下你理解的c++中的smart pointer四個智慧型指標

c++裡面的四個智慧型指標:auto_ptr, shared_ptr, weak_ptr, unique_ptr,第乙個已經被拋棄了。

為什麼要使用智慧型指標:

智慧型指標的作用是管理乙個指標,因為存在:申請的空間在函式結束時忘記釋放,造成記憶體洩漏。使用智慧型指標可以很大程度上避免這個問題,因為智慧型指標就是乙個類,當超出了類的作用域時,類會自動呼叫析構函式,析構函式會自動釋放資源。所以智慧型指標的作用原理就是在函式結束時自動釋放記憶體空間,不需要手動釋放記憶體空間。

7.指標和陣列的區別

指標陣列

儲存資料的位址

儲存資料

間接訪問資料,首先獲得指標的內容,然後將其作為位址,從該位址中提取資料

直接訪問資料

通常用於動態的資料結構

通常用於固定數目且資料型別相同的元素

malloc分配,free釋放記憶體

隱式的分配和刪除

通常指向匿名資料,操作匿名函式

自身即為資料名

8.//《-》智慧型指標

9.為什麼析構函式必須是虛函式?為什麼c++預設的析構函式不是虛函式?

1.將可能會被繼承的父類的析構函式設定為虛構函式,可以保證當我們new乙個子類,然後使用基類指標指向該子類物件,釋放基類指標時可以釋放掉子類的空間,防止記憶體洩漏。

2.c++預設的析構函式不是虛函式是因為虛函式需要額外的虛函式表和虛表指標,占用額外的記憶體。而對於不會被繼承的類來說,其析構函式如果是虛函式,就會浪費記憶體。因此c++預設的析構函式也不是虛函式,而只有當需要當作父類時,設定為虛函式。

10.說一下函式指標

指向函式的指標,c在編譯時,每乙個函式都有乙個入口位址,該入口位址就是函式指標所指向的位址。有了指向函式的指標變數後,可用該指標呼叫函式。

11.c++中析構函式的作用

析構函式和建構函式相對應,當物件結束其生命週期,如函式呼叫完畢時,系統會自動執行析構函式。

在建構函式前加~,~study(),它不能帶任何引數,也沒有返回值,只有乙個析構函式,不能過載。

使用者沒有編寫,系統會自動呼叫。

類析構函式的順序:1.派生類本身的析構函式 2)物件成員析構函式 3)基類析構函式

12.過載和覆蓋的區別

過載:兩個函式名相同,引數列表不同,返回值沒有要求,在同一作用域

重寫:子類繼承父類,父類中的函式是虛函式,在子類中重新定義了這個虛函式

13.說一下strcpy和strlen

strcpy是字串拷貝函式,原型

char *strcpy(char* dest, const char *src)

從src逐字節拷貝到dest,直到遇到'\0'結束,因為沒有指定長度,可能會導致拷貝越界,造成緩衝區溢位漏洞

strlen:計算字串長度,返回從開始遇到\n的個數。

14.c++裡是怎麼定義常量的?常量存放在記憶體的哪個位置?

常量在c++裡的定義就乙個top-level const 加上物件型別,常量定義必須初始化。對於區域性物件,常量存放在棧區,對於全域性物件,常量存放在全域性/靜態儲存區。對於字面值常量,常量存放在常量儲存區。

15.const修飾成員函式的目的是什麼?

函式呼叫不會對物件做出任何更改,事實上,如果確認不會對物件做更改,就應該為函式加上const限定,這樣無論const物件還是普通物件都可以呼叫該函式。

16.說一下entern"c"

c++呼叫c函式需要entern"c",因為c語言沒有函式過載

17.new/delete,和malloc/free的區別

前者是c++的關鍵字

後者是c的庫函式,必須指明申請的空間大小,對於類型別物件,後者不會呼叫建構函式和析構函式。

18.虛函式表是怎麼實現執行時多型的

子類若重寫父類虛函式,虛函式表中,該函式的位址會被替換,對於存在的虛函式的類的物件,在vs中,物件的物件模型的頭部存放指向虛函式表的指標。

19.c語言怎麼進行函式呼叫的

每乙個函式呼叫都會分配函式棧,在棧內進行函式執行過程。呼叫前,先把返回位址壓棧,然後把當前函式的esp指標壓棧。

20.c語言引數壓棧的順序

從右到左

21.c++如何處理返回值

生成乙個臨時變數,把它的引用作為函式引數傳入函式內。

牛客網 C 面試寶典 基礎知識(3)

如果同時定義了兩個函式,乙個帶const,乙個不帶,會有問題嗎?不會,這相當於函式的過載。請你來說一說隱式型別轉換參考 對於內建型別,低精度的變數給高精度變數賦值會發生隱式型別轉換 可以用單個形參來呼叫 的建構函式定義了從 形參型別 到 該類型別 的乙個隱式轉換。說說你了解的型別轉換 const c...

牛客網 C 面試寶典 基礎知識(4)容器和演算法

感覺牛客網的整理有丟丟凌亂 請你來說一下map和set有什麼區別,分別又是怎麼實現的?map和set都是c 的關聯容器,其底層實現都是紅黑樹 rb tree map和set區別在於 2 set的迭代器是const的,不允許修改元素的值 map允許修改value,但不允許修改key。其原因是因為map...

C 面試基礎知識總結 類

訪問控制和封裝 友元名字查詢與類的作用域 類的靜態成員與普通成員 在成員函式中,可以直接訪問資料成員,而在這個過程中實際上隱式地使用了乙個名為this的隱式指標,該指標指向正是這個類物件。include using namespace std struct people int main int a...