c 基礎 面試題

2021-10-09 19:10:15 字數 4457 閱讀 2480

6 章 函式

15 章 物件導向程式設計

16章 模板與泛型程式設計

演算法題c++有哪些性質?

封裝、繼承、多型

封裝:實現了類的介面和實現的分離,隱藏類的具體實現,只提供給使用者介面。可以通過訪問說明符實現(public、private、protected)

繼承:從父類得到已有的特性,拓展已存在的**,實現**的復用。

多型:乙個介面 多個方法;動態多型、靜態多型。

static關鍵字
const定義的常量在超出其作用域之後其空間會被釋放,而static定義的靜態常量在函式執行後不會釋放其儲存空間。

static表示的是靜態的。類的靜態成員函式、靜態成員變數是和類相關的,而不是和類的具體物件相關的。即使沒有具體物件,也能呼叫類的靜態成員函式和成員變數。在c++中,static靜態成員變數不能在類的內部初始化。在類的內部只是宣告,定義必須在類定義體的外部,通常在類的實現檔案中初始化,如:double account::rate = 2.25;static關鍵字只能用於類定義體內部的宣告中,定義時不能標示為static

在c++中,const成員變數也不能在類定義處初始化,只能通過建構函式初始化列表進行,並且必須有建構函式。

const資料成員 只在某個物件生存期內是常量,而對於整個類而言卻是可變的。因為類可以建立多個物件,不同的物件其const資料成員的值可以不同。所以不能在類的宣告中初始化const資料成員,因為類的物件沒被建立時,編譯器不知道const資料成員的值是什麼。

const資料成員的初始化只能在類的建構函式的初始化列表中進行。要想建立在整個類中都恆定的常量,應該用類中的列舉常量來實現,或者static const。

全域性變數和區域性變數有什麼區別?是怎麼實現的?作業系統和編譯器是怎麼知道的?
區別:

1.宣告週期不同,全域性變數從程式開始到結束、 區域性變數在函式內部。

2.使用方式不同,全域性變數在整個程式都可使用,區域性變數只能在區域性使用

作業系統通過記憶體分配的位置判斷,全域性變數分配在全域性區,區域性變數分配在棧區。

node:記憶體四區

資料區:主要包括靜態全域性區和常量區,用來存放全域性區變數和靜態變數。全域性區存放全域性變數和靜態變數,常量區存放常量

棧 區:由編譯器自動分配釋放,存放函式的引數值、區域性變數等。操作類似資料結構中的棧

堆 區:由程式設計師分配釋放(動態記憶體),若程式設計師不釋放由系統**

**區:存放函式體的二進位制**

基類的析構函式不是虛函式,會帶來什麼影響?
派生類的析構函式用不上,會造成記憶體洩露

記憶體的分配有哪幾種?

1.靜態區建立:在編譯過程就分配好了,如全域性變數,在整個程式執行期間都存在。

2.棧上創 建:函式執行時建立,如區域性變數,在函式結束時釋放。

3.堆上創 建:動態記憶體分配,需要時用malloc或new申請記憶體,用過後用free或delete釋放

new/delete 與malloc/free的區別與聯絡 [禾多]

1. 定義不同

molloc/free為c的【標準庫函式】 函式原型:

void

*malloc

(size_t size)

//引數代表位元組個數

void free (

void

* pointer)

//引數代表記憶體位址

new和delete為c++的操作運算子,他呼叫的分別是賦值【運算子過載】operator new()和operator delete()

2. 使用方式不同

//-- molloc/free

//開闢乙個空間

int* p1=

(int*)

malloc

(sizeof

(int))

;//分配記憶體

if(p1==

null

)exit(1

);free

(p1)

;//釋放記憶體

//開闢多個空間

int p2=

(int*)

malloc

(sizeof

(int)*

4);if

(p2==

null

)exit(1

);free

(p2)

;

//-- new/delete

// 開闢乙個空間

int* p1 =

newint(1

);delete p1;

//開闢多個空間

int* p2=

newint[4

];delete

p2;

由此可知:

(1) malloc 返回的是 void* 需要強制轉換,new返回對應型別的指標

(2)malloc 需要檢擦記憶體是否為空,因為開闢失敗會返回null;new不用,因為分配失敗會丟擲異常

(3)無論釋放幾個空間大小,free只傳遞指標,多個物件時delete加[ ]

delete 釋放多個物件需要加 的原因?

malloc/free為函式只是開闢空間並釋放,new/delete則不僅會開闢空間,並呼叫建構函式和析構函式進行初始化和清理,

new/delete實現機制:

new/delete實現機制:

即過程如上,在開闢大小會多開闢四個位元組,用於存放物件的個數,在返回位址時則會向後偏移4個位元組,而在delete時則會檢視記憶體上物件個數,從而根據個數count確定呼叫幾次析構函式,從而完全清理所有物件占用記憶體。

對於內建型別若new但用delete釋放時,沒有影響,但若是自定義型別如類時,若釋放使用 delete時,這時則會只呼叫一次析構函式,只析構了乙個物件,剩下的物件都沒有被清理。

所以有一些說法:new在堆上分配記憶體,可以說是不太精確的。

1. 函式過載 [禾多]

定義:同一作用域內的幾個函式名字相同形參列表不同

條件:

node:函式返回值不是判斷函式過載的標準

1. 虛函式 [禾多]

定義:基類希望它的派生類各自定義適合自己的版本,此時基類就將這些函式宣告成虛函式(virtual function)

2. 多型 [禾多]

2.1 請談談你對多型的理解

多型實現的三個條件:繼承、虛函式重寫、父類指標指向子類物件(只能是父類指標指向子類物件)

多型的實現效果:同樣的呼叫語句有多種不同的表現形態

多型的c++實現:virtual關鍵字,告訴編譯器這個函式要支援多型;不是根據指標型別判斷如何呼叫,而是根據指標所指向的實際物件型別來判斷如何使用

2.2 c++編譯器如何實現多型

2.3 談談對重寫、過載的理解

函式過載:

函式重寫:

定義——在子類中定義與父類完全相同的函式

2.4 是否可以為每個成員函式都宣告虛函式,為什麼

2.5 建構函式中呼叫虛函式能實現多型嗎? 為什麼

2.6 虛函式表指標被編譯器初始化過程,你是如何理解的

2.7父類的建構函式中呼叫虛函式,能發生多型嗎

2.8 為什麼要定義虛析構函式?

建構函式不能是虛函式,建立乙個派生類物件時,必須從類層次的根開始,沿著繼承路徑逐個呼叫類的建構函式。

虛構函式可以是虛的,虛析構函式用於指引delete運算子正確析構動態物件。這樣做是為了當用乙個基類的指標刪除乙個派生類的物件時,派生類的析構函式會被呼叫

參考1參考2

2.9 為什麼要引入多型?

子類中定義與父類相同的函式:1.父類中的函式依然會繼承給子類 2.子類函式將隱藏父類函式 3.用域作用符::可以訪問父類函式。

新的需求:1. 父類指標指向子類物件,呼叫子類函式;2.父類指標指向父類物件,呼叫父類函式

2.10 多型的理論基礎

靜態聯編和動態聯編

聯編:**快之間的關聯

靜態聯編:**編譯階段,建立的關聯

動態聯編:**執行階段,建立的關聯

1. 實現和分離必須放在同乙個檔案?

c++ 中的模板類宣告標頭檔案和實現檔案分離後,如何能實現正常編譯?

c++模板宣告定義分離編譯錯誤詳解

2. 基類析構函式 [禾多]

字串翻轉 [禾多]

題目:malop => lopma

參考blog

[1] new/delete與malloc/free的區別與聯絡詳解!

C 基礎面試題

c c struct aa int a char b struct student 純虛函式的定義形式 virtual 0 在虛函式和純虛函式的定義中不能有static識別符號,原因很簡單,被static修飾的函式在編譯時候要求前期bind,然而虛函式卻是動態繫結 run time bind 而且被...

C 基礎經典面試題

1.請問以下 有什麼問題 int main 沒有為str分配記憶體空間,將會發生異常 問題出在將乙個字串 複製進乙個字元變數指標所指位址。雖然可以正確輸出結果,但因為越界進行記憶體讀寫而導致程式崩潰。char s aaa printf s s s 0 b printf s s 有 什麼錯?aaa 是...

C 基礎面試題(一)

1.簡答介紹物件的構成,並做出說明 物件的構成 屬性,方法,事件 屬性 乙個物件與生俱來的,方法 乙個物件的主動行為,事件 乙個物件的被動行為 2.c 中15中屬性型別分別是哪些 值型別 整數8種 byte,sbyte,short,ushort,int,uint,long,ulong,小數三種 fl...