c/c++自學整理?

c/c++學習指南,自學概念整理-面試題整理

方法/步驟

1. C中static有什麼作用

  (1)隱藏。 當我們同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性,故使用static在不同的檔案中定義同名函式和同名變數,而不必擔心命名衝突。

  (2)static的第二個作用是保持變數內容的持久。儲存在靜態資料區的變數會在程式剛開始執行時就完成初始化,也是唯一的一次初始化。共有兩種變數儲存在靜態儲存區:全域性變數和static變數。

  (3)static的第三個作用是預設初始化為0.其實全域性變數也具備這一屬性,因為全域性變數也儲存在靜態資料區。在靜態資料區,記憶體中所有的位元組預設值都是0×00,某些時候這一特點可以減少程式設計師的工作量。

  2.C++中const有什麼用?

  不要一聽到const就說是常量,這樣給考官一種在和一個外行交談的感覺。應該說const修飾的內容不可改變就行了, 定義常量只是一種使用方式而已,還有const資料成員,const引數, const返回值, const成員函式等, 被const修飾的東西都受到強制保護,可以預防意外的變動,能提高程式的健壯性。

  3. C與C++各自是如何定義常量的?有什麼不同?

  C中是使用巨集#define定義, C++使用更好的const來定義。

  區別:

  1)const是有資料型別的常量,而巨集常量沒有,編譯器可以對前者進行靜態型別安全檢查,對後者僅是字元替換,沒有型別安全檢查,而且在字元替換時可能會產生意料不到的錯誤(邊際效應)。

  2)有些編譯器可以對const常量進行除錯, 不能對巨集除錯。

  4. 既然C++中有更好的const為什麼還要使用巨集?

  const無法代替巨集作為衛哨來防止檔案的重複包含。

  5. C++中引用和指標的區別?

  引用是物件的別名, 操作引用就是操作這個物件, 必須在建立的同時有效得初始化(引用一個有效的物件, 不可為NULL), 初始化完畢就再也不可改變, 引用具有指標的效率, 又具有變數使用的方便性和直觀性, 在語言層面上引用和物件的用法一樣, 在二進位制層面上引用一般都是通過指標來實現的, 只是編譯器幫我們完成了轉換。 之所以使用引用是為了用適當的工具做恰如其分的事, 體現了最小特權原則。

  6. 說一說C與C++的記憶體分配方式?

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

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

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

  7. new/delete 與 malloc()/free() 的區別?

  malloc() 與 free() 是C語言的標準庫函式, new/delete 是C++的運算子, 他們都可以用來申請和釋放記憶體, malloc()和free()不在編譯器控制權限之內, 不能把建構函式和解構函式的任務強加給他們。www.cdtarena.com

  8. #include 和#include"a.h" 有什麼區別?

  答:對於#include ,編譯器從標準庫路徑開始搜尋 a.h對於#include "a.h" ,編譯器從使用者的工作路徑開始搜尋 a.h

  9. 在C++ 程式中呼叫被 C編譯器編譯後的函式,為什麼要加 extern "C"?

  C++語言支援函式過載,C語言不支援函式過載。函式被C++編譯後在庫中的名字與C語言的不同。假設某個函式的原型為: void foo(int x, int y);該函式被C編譯器編譯後在庫中的名字為_foo,而C++編譯器則會產生像_foo_int_int之類的名字。C++提供了C連線交換指定符號extern"C"來解決名字匹配問題。

  10. C++中的什麼是多型性? 是如何實現的?

  多型性是面向物件程式設計語言繼資料抽象和繼承之後的第三個基本特徵。它是在執行時出現的多型性通過派生類和虛擬函式實現。基類和派生類中使用同樣的函式名, 完成不同的操作具體實現相隔離的另一類介面,即把" w h a t"從"h o w"分離開來。多型性提高了程式碼的組織性和可讀性,虛擬函式則根據型別的不同來進行不同的隔離。

  11. 什麼是動態特性?

  在絕大多數情況下, 程式的功能是在編譯的時候就確定下來的, 我們稱之為靜態特性。 反之, 如果程式的功能是在執行時刻才能確定下來的, 則稱之為動態特性。C++中, 虛擬函式,抽象基類, 動態繫結和多型構成了出色的動態特性。

  12.什麼是封裝?C++中是如何實現的?

  封裝來源於資訊隱藏的設計理念, 是通過特性和行為的組合來建立新資料型別讓介面與具體實現相隔離。C++中是通過類來實現的, 為了儘量避免某個模組的行為干擾同一系統中的其它模組,應該讓模組僅僅公開必須讓外界知道的介面。

  13. 什麼是RTTI?

  RTTI事指執行時型別識別(Run-time type identification)在只有一個指向基類的指標或引用時確定一個物件的準確型別。

  14. 什麼是拷貝建構函式?

  它是單個引數的建構函式,其引數是與它同屬一類的物件的(常)引用;類定義中,如果未提供自己的拷貝建構函式,C++提供一個預設拷貝建構函式,該預設拷貝建構函式完成一個成員到一個成員的拷貝

  15. 什麼是深淺拷貝?

  淺拷貝是建立了一個物件用一個現成的物件初始化它的時候只是複製了成員(簡單賦值)而沒有拷貝分配給成員的資源(如給其指標變數成員分配了動態記憶體); 深拷貝是當一個物件建立時,如果分配了資源,就需要定義自己的拷貝建構函式,使之不但拷貝成員也拷貝分配給它的資源。

  16.面向物件程式設計的優點?

  開發時間短, 效率高, 可靠性高。面向物件程式設計的編碼具有高可重用性,可以在應用程式中大量採用成熟的類庫(如STL),從而雖短了開發時間,軟體易於維護和升級。

相關問題答案