常見的面試C 問題

2021-07-09 01:43:31 字數 4392 閱讀 8412

1、c++中struct和class有什麼區別

(一) 預設繼承許可權。 如果不明確指定,來自 class 的繼承按照 private 繼承處理,來自 struct的繼承按照 public 繼承處理;

(二)成員的預設訪問許可權。class 的成員預設是 private 許可權,struct 預設是 public 許可權。

除了這兩點,class 和 struct 基本就是乙個東西。語法上沒有任何其它區別

struct中的成員預設為public,而class中的預設為private;如果不是為了類中由屬於自己的私有 成員,我覺得能用class解決的問題都能用struct實現。

2、volitate的作用是什麼

是用來修飾變數的,表明某個變數的值可能會隨時被外部改變,因此這些變數的訪問不能被快取到暫存器,每次使用需要重新讀取。

下面是volitate的介個例子:

1). 並行裝置的硬體暫存器(如:狀態暫存器)

2). 乙個中斷服務子程式中會訪問到的非自動變數(non-automatic variables)

3). 多執行緒應用中被幾個任務共享的變數

經常遇到的面試題:

1). 乙個引數既可以是const還可以是volatile嗎?解釋為什麼。

2). 乙個指標可以是volatile 嗎?解釋為什麼。

3). 下面的函式有什麼錯誤:

int square(volatile int *ptr)

下面是答案:

1). 是的。乙個例子是唯讀的狀態暫存器。它是volatile因為它可能被意想不到地改變。它是const因為程式不應該試圖去修改它。

2). 是的。儘管這並不很常見。乙個例子是當乙個中服務子程式修改乙個指向乙個buffer的指標時。

3). 這段**有個惡作劇。這段**的目的是用來返回指標*ptr指向值的平方,但是,由於*ptr指向乙個volatile型引數,編譯器將產生類似下面的**:

int square(volatile int *ptr)

由於*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結果,這段**可能返回不是你所期望的平方值!正確的**如下:

long square(volatile int *ptr)

3、當乙個類a中沒有任何成員變數和成員函式時,sizeof(a) = ?

不是零,而是1,如果是0的話,宣告乙個classa[10]物件陣列,而每乙個物件占用的空間都是0;這樣就沒有辦法區分a[0],a[1]...了。

4、hash()函式的作用是什麼?

hash,一般翻譯做"

雜湊",也有直接音譯為"

雜湊"的,就是把任意長度的輸入(又叫做預對映, pre-image),通過

雜湊演算法

,變換成固定長度的輸出,該輸出就是

雜湊值。這種轉換是一種

壓縮對映

,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,而不可能從雜湊值來唯一的確定輸入值。簡單的說就是一種將任意長度的訊息壓縮到某一固定長度的

訊息摘要

的函式。

5、makefile檔案的作用?

makefile關係到了整個工程的編譯規則。乙個工程中的原始檔不計數,其按型別、功能、模組分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更複雜的功能操作,因為makefile就像乙個

shell指令碼

一樣,其中也可以執行

作業系統

的命令。、

6、static有什麼作用?

1.限制變數的作用域(檔案級的)。

2.設定變數的儲存域(全域性資料區)。

c語言中主要用來定義: 1.

定義全域性靜態變數 :在全域性變數前面加上關鍵字static,該全域性變數變成了全域性靜態變數。全域性靜態變數有以下特點:

(1)在全域性資料區內分配記憶體

(2)如果沒有初始化,其預設值為0

(3)該變數在本檔案內從定義開始到檔案結束可見

2.定義區域性靜態變數:在區域性靜態變數前面加上關鍵字static,該區域性變數便成了靜態區域性變數。靜態區域性變數有以下特點:

(1)該變數在全域性資料區分配記憶體

(2)如果不顯示初始化,那麼將被隱式初始化為0

(3)它始終駐留在全域性資料區,直到程式執行結束

(4)其作用域為區域性作用域,當定義它的函式或語句塊結束時,其作用域隨之結束。

3.定義靜態函式:在函式的返回型別加上static關鍵字,函式即被定義成靜態函式。靜態函式有以下特點:

(1) 靜態函式只能在本原始檔中使用

(2)在檔案作用域中宣告的inline函式預設為static

說明:靜態函式只是乙個普通的全域性函式,只不過受static限制,他只能在檔案坐在的編譯單位內使用,不能呢個在其他編譯單位內使用。

在c++語言中新增了兩種作用:定義靜態資料成員或靜態函式成員

1.定義靜態資料成員。靜態資料成員有如下特點:

(1)記憶體分配:在程式的全域性資料區分配

(2)初始化和定義:靜態資料成員定義時要分配空間,所以不能在類宣告中初始化。

2.靜態成員函式。靜態成員函式與類相聯絡,不與類的物件相聯絡。靜態成員函式不能訪問非靜態資料成員。原因很簡單,非靜態資料成員屬於特定的類例項,靜態成員函式主要用於對靜態資料成員的操作。

(1)靜態成員函式沒有this指標。

7、 純虛函式是怎樣實現的?在編譯原

理上講一下?

在類內部新增乙個虛函式表指標,該指標指向乙個虛函式表,該虛函式表包含了所有

的虛函式的入口位址,每個類的虛函式表都不

一樣,在執行階段可以循此脈絡找到自己的函式入口

。 純虛函式相當於佔位符, 先在虛函式表中佔乙個位置由派生類實現後再把真正的函式指標填

進去。除此之外和普通的虛函式沒什麼區別。

8、new/malloc,free/delete的區別?

delete 會呼叫物件的析構函式,和 new 對應; free 只會釋放記憶體,new 呼叫建構函式。malloc

與 free 是 c++/c 語言的標準庫函式,new/delete 是 c++的運算子。它們都可用於申請動態

記憶體和釋放記憶體。對於非內部資料型別的物件而言,光用 maloc/free 無法滿足動態物件的

要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於

malloc/free 是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和

析構函式的任務強加於 malloc/free。因此 c++語言需要乙個能完成動態記憶體分配和初始化

工作的運算子 new,以及乙個能完成清理與釋放記憶體工作的運算子delete。注意new/delete

不是庫函式。

9、tcp/ip協議:

tcp/ip(傳輸控制協議/

網間協議

)是一種

網路通訊協議

,它規範了網路上的所有通訊裝置,尤其是乙個

主機與另乙個主機之間的資料往來格式以及傳送方式。tcp/ip是internet的基礎協議,也是一種電腦資料打包和

定址的標準方法。在

資料傳送

中,可以形象地理解為有兩個信封,tcp和ip就像是信封,要傳遞的資訊被劃分成若干段,每一段塞入乙個tcp信封,並在該信封面上記錄有分段號的資訊,再將tcp信封塞入ip大信封,傳送上網。在接受端,乙個tcp軟體包收集信封,抽出資料,按傳送前的順序還原,並加以校驗,若發現差錯,tcp將會要求重發。因此,tcp/ip在internet中幾乎可以無差錯地傳送資料。 對普通使用者來說,並不需要了解網路協議的整個結構,僅需了解ip的位址格式,即可與世界各地進行

網路通訊。

tcp協議是一種面向連線,基於位元組流的傳輸層通訊協議。

tcp三次握手的過程如下:

1. 客戶端傳送syn(seq=x)報文給伺服器端,進入syn_send狀態。

2. 伺服器端收到syn報文,回應乙個syn (seq=y)ack(ack=x+1)報文,進入

syn_recv

狀態。

3. 客戶端收到伺服器端的syn報文,回應乙個ack(ack=y+1)報文,進入established狀態。

ip協議

是用於將多個包交換網路連線起來的,它在源位址和目的位址之間傳送一種稱之為資料報的東西,它還提供對資料大小的重新組裝功能,以適應不同網路對包大小的要求。

ip的責任就是把資料從源傳送到目的地。

10、socket網路程式設計:

1)、基本操作:

1、socket()函式

2、bind()函式

3、listen()、connect()函式

4、accept()函式

5、read()、write()函式等

6、close()函式

此文件持續更新中。。。

C 面試常見問題

1.引用和指標的區別 區別 1 引用不能為空,指標可以為空 2 引用必須初始化,指標不需要 3 引用初始化以後不能改變,指標可以改變初始化物件後的值 4 引用訪問物件後是直接訪問,指標訪問物件是間接訪問 5 引用大小是所引用物件的大小,指標大小是指標類本身的大小 6 引用沒有const,指標有con...

C 面試常見問題

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

C 常見面試問題

一 抽象與介面的區別 1,抽象 abstract 1 抽象類中可以有抽象方法,也可沒有 2 抽象方法包含實現,也可以由子類實現 3 抽象類不能被sealed修飾,只能使用abstract關鍵字 4 抽象方法不能在抽象類外部宣告 5 抽象類只能單繼承 6 可以有虛方法 virtual 在不同的繼承中,...