1. 程式人生 > >第三章:10道C/C++經典面試題

第三章:10道C/C++經典面試題

面試題 21:談談你對程式設計規範的理解或認識

程式設計規範可總結為:程式的可行性,可讀性、可移植性以及可測試性。
說明:這是程式設計規範的總綱目,面試者不一定要去背誦上面給出的那幾個例子,應該去理解這幾個例子說明的問題,想一想,自己如何解決可行性、可讀性、可移植性以及可測試性這幾個問題,結合以
上幾個例子和自己平時的程式設計習慣來回答這個問題。

面試題 22:&&和&、||和|有什麼區別

(1)&和|對運算元進行求值運算,&&和||只是判斷邏輯關係。
(2)&&和||在在判斷左側運算元就能確定結果的情況下就不再對右側運算元求值。
注意:在程式設計的時候有些時候將&&或||替換成&或|沒有出錯,但是其邏輯是錯誤的,可能會導致不可預想的後果(比如當兩個運算元一個是 1 另一個是 2 時)。

面試題 23:C++的引用和 C 語言的指標有什麼區別

指標和引用主要有以下區別:
(1)引用必須被初始化,但是不分配儲存空間。指標不宣告時初始化,在初始化的時候需要分配儲存空間。
(2)引用初始化以後不能被改變,指標可以改變所指的物件。
(3)不存在指向空值的引用,但是存在指向空值的指標。
注意:引用作為函式引數時,會引發一定的問題,因為讓引用作引數,目的就是想改變這個引用所指向地址的內容,而函式呼叫時傳入的是實參,看不出函式的引數是正常變數,還是引用,因此可能會引發錯誤。所以使用時一定要小心謹慎。

面試題 24:寫一個“標準”巨集 MIN

寫一個“標準”巨集 MIN,這個巨集輸入兩個引數並且返回較小的一個。
【答案】
#define min(a,b)((a)<=(b)?(a):(b))
注意:在呼叫時一定要注意這個巨集定義的副作用,如下呼叫:
((++*p)<=(x)?(++*p):(x)。
p 指標就自加了兩次,違背了 MIN 的本意。

面試題 25:typedef 和 define 有什麼區別

(1)用法不同:typedef 用來定義一種資料型別的別名,增強程式的可讀性。define 主要用來定義常量,以及書寫複雜使用頻繁的巨集。
(2)執行時間不同:typedef 是編譯過程的一部分,有型別檢查的功能。define 是巨集定義,是預編譯的部分,其發生在編譯之前,只是簡單的進行字串的替換,不進行型別的檢查。
(3)作用域不同:typedef 有作用域限定。define 不受作用域約束,只要是在 define 聲明後的引用都是正確的。
(4)對指標的操作不同:typedef 和 define 定義的指標時有很大的區別。
注意:typedef 定義是語句,因為句尾要加上分號。而 define 不是語句,千萬不能在句尾加分號。

面試題 26:關鍵字 const 是什麼

const 用來定義一個只讀的變數或物件。主要優點:便於型別檢查、同巨集定義一樣可以方便地進行引數的修改和調整、節省空間,避免不必要的記憶體分配、可為函式過載提供參考。
說明:const 修飾函式引數,是一種程式設計規範的要求,便於閱讀,一看即知這個引數不能被改變,
實現時不易出錯。

面試題 27:static 有什麼作用

static 在 C 中主要用於定義全域性靜態變數、定義區域性靜態變數、定義靜態函式。在 C++中新增了兩種作用:定義靜態資料成員、靜態函式成員。
注意:因為 static 定義的變數分配在靜態區,所以其定義的變數的預設值為 0,普通變數的預設值為隨機數,在定義指標變數時要特別注意。

面試題 28:extern 有什麼作用

extern 標識的變數或者函式宣告其定義在別的檔案中,提示編譯器遇到此變數和函式時在其它模組中尋找其定義。

面試題 29:流操作符過載為什麼返回引用

在程式中,流操作符>>和<<經常連續使用。因此這兩個操作符的返回值應該是一個仍舊支援這兩個操作符的流引用。其他的資料型別都無法做到這一點。
注意:除了在賦值操作符和流操作符之外的其他的一些操作符中,如+、-、*、/等卻千萬不能返回引用。

因為這四個操作符的物件都是右值,因此,它們必須構造一個物件作為返回值。

面試題 30:簡述指標常量與常量指標區別

指標常量是指定義了一個指標,這個指標的值只能在定義時初始化,其他地方不能改變。常量指標是指定義了一個指標,這個指標指向一個只讀的物件,不能通過常量指標來改變這個物件的值。
指標常量強調的是指標的不可改變性,而常量指標強調的是指標對其所指物件的不可改變性。

注意:無論是指標常量還是常量指標,其最大的用途就是作為函式的形式引數,保證實參在被呼叫函式中的不可改變特性。