面試筆試整理2 c 常問問題

2021-08-07 16:28:53 字數 4262 閱讀 6294

1、new<>delete和malloc<>free區別:

這兩個表示式都用於申請動態記憶體和釋放動態記憶體。但是new可以用於非內部資料型別的物件,而malloc是無法做到的,因為new和delete是作用於建構函式和析構函式的,是c++的運算子;但是malloc是庫函式。

注意delete是呼叫一次析構函式,而delete會對每乙個成員都呼叫析構函式,所以在用new申請了乙個動態陣列後,要用delete進行釋放。

c++有三種記憶體管理方式:自動儲存、靜態儲存、動態儲存、(c++11有了執行緒儲存)。

2、const與#define 相比,有何優點

const int b =64; 有三個使用場景,主要用於防止以外的變動,與define可以明確常量型別而define只是簡單替換:

3、陣列( )、引用( & )、指標( * )區別

本質:指標是乙個變數,儲存內容是乙個位址,指向記憶體的乙個儲存單元。而引用是原變數的乙個別名,實質上和原變數是乙個東西,是某塊記憶體的別名。 比如對指標用++就是位址加1,而對引用++就是對值+1;

而對陣列而言,陣列要麼在靜態儲存區被建立(如全域性陣列),要麼在棧上被建立。陣列名對應著(而不是指向)一塊記憶體,其位址與容量在生命期內保持不變,只有陣列的內容可以改變。而指標可以隨時指向任意型別的記憶體塊,它的特徵是「可變」,所以我們常用指標來操作動態記憶體。最明顯的就是用sizeof計算大小的時候。

要保護引用在函式中不被改變可以使用常量引用。

4、指標陣列和陣列指標的區別

顧名思義,陣列指標應該是指向陣列的指標,而指標陣列則是指該陣列的元素均為指標。

陣列指標,是指向陣列的指標,其本質為指標,形如int (*p)[10],p即為指向陣列的指標;陣列指標是指向陣列首元素的位址的指標,其本質為指標,可以看成是二級指標

指標陣列,在c語言和c++中,陣列元素全為指標的陣列稱為指標陣列,其中一維指標陣列的定義形式為:

型別名 *陣列識別符號[陣列長度]

指標陣列中每乙個元素均為指標,其本質為陣列,例如我們經常使用的動態陣列的就是基於此的使用,如下示例:

size_t row,col;

//輸入row和col的數值

int **mathtable = new

int*[row];

for( int i = 0 ; i < row ; i++ )

mathtable[i] = new

int[col];

//code

for( int i = 0 ; i < row ; i++ )

delete mathtable[i];

delete mathtable;

也就是形如int p[10]這樣的宣告,就是我們這裡的指標陣列,從宣告形態上來講,是由於的優先順序高於,又有諸如下面的指標:

*ptr_arry[i]

指標陣列中的元素可以表示為:

((ptr_arry+i))

()的優先順序較高,又由於又結合的原因,可以化簡為:

**(ptr_arry+i)

由於陣列元素均為指標,因此prt_array[i]是指第i+1個元素的指標。

大部分的函式問題都可以歸為類的問題裡,這裡只寫一點點

1、返回引用

返回引用的函式可以看成是被引用變數的別名,這樣可以讓程式執行的更快,最關鍵的一點是避免返回函式終止時不再存在的記憶體單元的引用!!錯誤的例子如下

const

int &fun(int &ft)

正常有兩種方式:

2、模板函式

templatet>

void swap(t &a, t &b)

1、建構函式和析構函式

建構函式用於初始化一些類中的成員變數,析構函式用於釋放一些建構函式占用的空間。最常用的是在建構函式中new分配了記憶體,則在析構函式中要delete這部分空間。如果沒有new也可以用預設的建構函式。

2、this指標的作用

在需要對兩個物件成員進行比較的時候比如有s1.compare(s2)這個方法,在成員函式中要呼叫自身的時候就要用到this指標(指向呼叫物件)

3、作用域為類的常量

我們在定義類的時候想寫乙個常量給類用的時候希望這麼寫:

class

a1;

但是這是不對的,因為在宣告物件之前沒有用於儲存值的空間,但是我們可以寫為下面的形式:

class

a1;

因為這個常量和靜態常量儲存在一起,而不是儲存在物件中。

5、static和const高階作用:

static關鍵字至少有下列5個作用:

(1)函式體內static變數的作用範圍為該函式體,不同於auto變數,該變數的記憶體只被分配一次,因此其值在下次呼叫時仍維持上次的值;

(2)在模組內的static全域性變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問;

(3)在模組內的static函式只可被這一模組內的其它函式呼叫,這個函式的使用範圍被限制在宣告它的模組內;

(4)在類中的static成員變數屬於整個類所擁有,對類的所有物件只有乙份拷貝,也就是派生類和父類中的static是公用空間的;

(5)在類中的static成員函式屬於整個類所擁有,這個函式不接收this指標,因而只能訪問類的static成員變數。

const關鍵字至少有下列5個作用:

(1)欲阻止乙個變數被改變,可以使用const關鍵字。在定義該const變數時,通常需要對它進行初始化,因為以後就沒有機會再去改變它了;

(2)對指標來說,可以指定指標本身為const,也可以指定指標所指的資料為const,或二者同時指定為const;

(3)在乙個函式宣告中,const可以修飾形參,表明它是乙個輸入引數,在函式內部不能改變其值;

(4)對於類的成員函式,若指定其為const型別,則表明其是乙個常函式,不能修改類的 成員變數;

(5)對於類的成員函式,有時候必須指定其返回值為const型別,以使得其返回值不為「左值」。

6、友元

c++在控制對類物件中的私有部分訪問的時候,除了定義為public,還提供了友元的概念,總共有3種:

class a1;
在類中,友元並不屬於類本身,所以不能繼承。

1、什麼虛函式?什麼是純虛函式?基類為什麼要用虛析構函式?

(1)虛函式就是用於實現多型的,因為乙個類函式的呼叫不是在編譯時刻確定的,而是在執行時刻確定的,編寫**的時候並不知道被呼叫的是基類的函式還是派生類的函式,所以稱為『虛函式』達到多型的效果。核心理念就是通過基類訪問派生類定義的函式。

(2)純虛函式:在基類中宣告的虛函式,它在基類中沒有定義,但是要求任何派生類都要定義自己的實現方法。

virtual

void f1()=0

除了上面虛函式的派生作用外,還因為許多基類物件本身是沒有任何意義的,所以乾脆變為純虛函式只用於繼承,而且他們必須在繼承類中重新宣告。

(3)上面說了由於派生的關係並不知道基類的指標呼叫了哪乙個,所以析構函式應當是虛函式,它將呼叫相應物件型別的析構函式,因此,如果指標指向的是子類物件,將呼叫子類的析構函式,然後自動呼叫基類的析構函式。

2、繼承時不能繼承基類建構函式和析構函式,所以在建立派生類建構函式的時候可以成員初始化表的方式呼叫基函式的建構函式。但是析構函式是預設呼叫的

3、私有繼承

繼承可以分為兩大類:is-a和has-a。is-a是指的共有繼承,可以將基類的public成員和protected成員原封不動的繼承下來,變為派生物件共有介面的一部分(繼承介面)。而has-a意味著基類的方法不會成為派生物件介面的一部分,因為他們全變成private成員了(也就是只繼承基類的實現)。

protected:當繼承是面向派生類而不是面向使用者介面中的一部分時,就選用protected繼承。

**如下:

繼承描述符

父public成員

父protected成員

父private成員

public

子public成員

子protected成員

-protected

子protected成員

子protected成員

-private

子private成員

子private成員-

4、虛基類

虛基類使得從多個類(基類相同)派生出的物件只繼承乙個基類物件。

C 研發面試常問問題整理

1 在瀏覽器中輸入乙個 開啟網頁的過程,用到了什麼協議,這些協議分別在 用到。dns解析 tcp連線 http請求 伺服器處理請求並返回http報文 瀏覽器解析渲染介面。參考 前端經典面試題 從輸入url到頁面載入發生了什麼?2 tcp三次握手及四次揮手的過程。為什麼不是兩次?如果兩次握手有什麼後果...

Mysql面試常問問題

資料庫基礎知識 1 為什麼要使用資料庫 2 什麼是sql?3 什麼是mysql?4 資料庫三大正規化是什麼 5 mysql有關許可權的表都有哪幾個 6 mysql的binlog有有幾種錄入格式?分別有什麼區別?資料型別 1 mysql有哪些資料型別 引擎1 mysql儲存引擎myisam與innod...

php 面試常問問題

1.看看簡歷,會問一些過去做的專案的使用者量 pv 吞吐量 相關難點和解決方法等 2.資料庫設計經驗,為什麼進行分表?分庫?一般多少資料量開始分表?分庫?分庫分表的目的?什麼是資料庫垂直拆分?水平拆分?分割槽等等?可以舉例說明 3.資料庫優化有哪些?分別需要注意什麼?4.web開發方面會遇到哪些快取...