C 常見基礎問題

2021-08-21 19:54:54 字數 2548 閱讀 3576

1、過載(overload)和重寫(overried,有的書也叫做「覆蓋」)的區別:

從定義上來說:

過載:是指允許存在多個同名函式,而這些函式的參數列不同(或許引數個數不同,或許引數型別不同,或許兩者都不同);

重寫:是指子類重新定義父類虛函式的方法;

從實現原理上來說:

過載:編譯器根據函式不同的參數列,對同名函式的名稱做修飾,然後這些同名函式就成了不同的函式(至少對於編譯器來說是這 樣的)。如,有兩個同名函式:function func(p:integer):integer;和function func(p:string):integer;。那麼編譯器做過修飾後的函式名稱可能是這樣的:int_func、str_func。對於這兩個函式的呼叫,在編譯器間就已經確定了,是靜態的。也就是說,它們的位址在編譯期就繫結了(早繫結);

重寫:當子類重新定義了父類的虛函式後,父類指標根據賦給它的不同的子類指標,動態的呼叫屬於子類的該函式,這樣的函式呼叫在編譯期間是無法確定的(呼叫的子類的虛函式的位址無法給出)。因此,這樣的函式位址是在執行期繫結的(晚繫結);

2、羅列出static和const關鍵字盡可能多的作用:

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

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

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

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

(4) 在類中的 static 成員變數屬於整個類所擁有,對類的所有物件只有乙份拷貝;

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

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

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

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

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

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

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

3、描述記憶體分配方式以及它們之間的區別:

(1) 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static 變數;

(2) 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集;

(3) 從堆上分配,亦稱動態記憶體分配。程式在執行的時候用 malloc 或 new 申請任意多少的記憶體,程式設計師自己負責在何時用 free 或 delete 釋放記憶體。動態記憶體的生存期由程式設計師決定,使用非常靈活,但問題也最多;

4、指標和引用的區別:

(1) 引用是變數的乙個別名,內部實現是唯讀指標;

(2) 引用只能在初始化時被賦值,其他時候值不能被改變,指標的值可以在任何時候被改變;

(3) 引用不能為null,指標可以為null;

(4) 引用變數記憶體單元儲存的是被引用變數的位址;

(5) "sizeof 引用" = 指向變數的大小 , "sizeof 指標"= 指標本身的大小;

(6) 引用可以取位址操作,返回的是被引用變數本身所在的記憶體單元位址;

(7) 引用使用在源**級相當於普通的變數一樣使用,做函式引數時,內部傳遞的實際是變數位址;

5、tcp和udp有什麼區別:

tcp:傳輸控制協議,提供的是面向連線、可靠的位元組流服務。

當客戶和伺服器彼此交換資料前,必須先在雙方之間建立乙個tcp連線,之後才能傳輸資料。

tcp提供超時重發,丟棄重複資料,檢驗資料,流量控制等功能,保證資料能從一端傳到另一端。

udp:使用者資料報協議,是乙個簡單的面向資料報的運輸層協議。

udp不提供可靠性,它只是把應用程式傳給ip層的資料報傳送出去,但是並不能保證它們能到達目的地。

由於udp在傳輸資料報前不用在客戶和伺服器之間建立乙個連線,且沒有超時重發等機制,故而傳輸速度很快

6、虛析構函式在什麼情況下使用?

通過基類的指標來刪除派生類的物件時,基類的析構函式應該是虛的。否則其刪除效果將無法實現。一般情況下,這樣的刪除只能夠刪除基類物件,而不能刪除子類物件,形成了刪除一半角象,從而千萬記憶體洩漏。

原因:在公有繼承中,基類對派生類及其物件的操作,只能影響到那些從基類繼承下來的成員。如果想要用基類對非繼承成員進      行操作,則要把基類的這個操作(函式)定義為虛函式。那麼,析構函式自然也應該如此:如果它想析構子類中的重新定義        或新的成員及物件,當然也應該宣告為虛的。

注意:如果不需要基類對派生類及物件進行操作,則不能定義虛函式(包括虛析構函式),因為這樣會增加記憶體開銷。

c 面試語法基礎常見問題

一.基礎 1.指標和引用的不同 從組合語言來看,乙個指標和乙個引用實現是相同的,他們都存放了乙個位址。但c 的高階語言特性賦予了引用和指標在使用上的差異 1 引用必須初始化,必須依賴另乙個物件才能存在,是另乙個物件的別名 2 引用初始化之後不能被改變 指標可以改變所指的物件 3 sizeof 引用 ...

C 常見基礎題目

下列的 b 是以引用作引數形式呼叫函式。a.形參和實參都是變數 b.形參是引用,實參是變數 c.形參是指標,實參是位址值 d.形參是陣列名,實參是陣列名 在下面有關析構函式的描述中,正確的是 c a.析構函式名與類名完全相同 b.乙個類中可以定義多個析構函式 c.析構函式不能指定返回型別 d.析構函...

C基礎常見題

1 求兩個數m和n的最大公約數 輾轉相除法 include include int divisor int m,int n printf 最大公約數為 d n n return0 2 判斷是否為閏年 void isleap int year int main 3 將100 300之間的素數輸出 bo...