前言:
考研複試面試時經常會問到一些程式設計語言的基礎知識,尤其C++面向對象這一塊,為了避免會用不會說的情況,本文作為個人筆記用最精煉的語言梳理了複試面試常考察的知識點(後附高頻面試題),個人這塊概念知識比較薄弱,複試前保下命ヾ(◍°∇°◍)ノ゙
參考資料
C++教程|菜鳥教程
網絡上各位大牛的博文
本文知識架構
- C++簡介
- C++程式
- C++存儲類
- 指針與引用
- 類和對象
- 繼承
- 重載
- 多态
- 資料封裝
- 資料抽象
- 記憶體管理
- 高頻面試題彙總
C++簡介
C++是什麼?
引入目的是什麼?
三個組成
核心語言:所有構件塊,包括變量、資料類型和常量等。
C++ 标準庫:提供了大量的函數,用于操作檔案、字元串等。
标準模闆庫(STL):提供了大量的方法,用于操作資料結構等。
四大特性(重點考察點)
封裝
繼承
多态
抽象
(問三大特性,回答前三個即可)
C++程式
C++程式是什麼?
基本文法包括哪幾類?
對象:對象具有 狀态和 行為。如:某一隻白色的正在叫喚的貓。對象是類的執行個體。
類:描述對象行為/狀态的 模闆。如:這一類白色正在叫喚的貓;
方法:從基本上說, 一個方法表示一種行為。一個類可以包含多個方法。
即時變量 :每個對象都有其獨特的即時變量。對象的狀态是由這些即時變量的值建立的。
C++存儲類
存儲類是什麼?
重要的幾種存儲類
auto
static
extern
auto存儲類
用于兩種情況:
1.聲明變量時根據初始化表達式 自動推斷該變量的類型;
2.聲明函數時函數傳回值的占位符。
static存儲類
extern存儲類
指針與引用
什麼是指針?
什麼是引用?
指針和引用有何差別?(主要差別)
初始化
引用必須在建立時被初始化;
指針可以在任何時間被初始化;
是否可變
引用隻能在定義時被初始化一次(從一而終),之後不可變;
指針可變;
是否可為空
引用不能為空,引用必須連接配接到一塊合法的記憶體;
指針可以為空。
類和對象
類是什麼?
對象是什麼?
類的成員函數是什麼?
類通路修飾符是什麼?
公有成員public
公有成員在程式中類的外部是可通路的。
私有成員private
私有成員變量或函數在類的外部是不可通路的。隻有類和友元函數可以通路私有成員。(預設情況下,類的所有成員都是私有的)
保護成員protected
保護成員變量或函數與私有成員有一點不同:保護成員在派生類中是可通路的。
類構造函數是什麼?
類析構函數是什麼?
友元函數
内聯函數
this指針
static靜态成員
靜态成員函數
靜态成員函數與普通成員函數的差別:
繼承
什麼是繼承?
引入目的是什麼?
通路控制和繼承
一個派生類繼承了所有的基類方法,但下列情況除外:
基類的構造函數、析構函數和拷貝構造函數。
基類的重載運算符。
基類的友元函數。
繼承類型有哪幾種?
繼承中有哪些特點?
三種繼承方式相應地改變了基類成員的通路屬性。無論哪種繼承方式,有兩點都沒有改變:
1.private成員隻能被本類成員(類内)和友元通路,不能被派生類通路;
2.protected成員可以被派生類通路。
具體變化:
1.public 繼承:基類 public 成員,protected 成員,private 成員的通路屬性在派生類中分别變成:public, protected, private
2.protected 繼承:基類 public 成員,protected 成員,private 成員的通路屬性在派生類中分别變成:protected, protected, private
3.private 繼承:基類 public 成員,protected 成員,private 成員的通路屬性在派生類中分别變成:private, private, private
重載
重載是什麼?
重載聲明是什麼?
重載決策是什麼?
函數重載
運算符重載
多态
什麼是多态?
什麼時候涉及到多态?
虛函數是什麼?
在基類中冠以關鍵字virtual的成員函數。 它提供了一種接口界面。
具體解釋可以看這個例子,講的還不錯: C++中虛函數的作用是什麼?
資料封裝
什麼是封裝?
引入目的是什麼?
實作方法是什麼?
資料抽象
什麼是抽象?
打個比方?
引入目的是什麼?
實作方法是什麼?
資料抽象與資料封裝的差別是什麼?
資料封裝是一種把 資料和操作資料的函數捆綁在一起的機制,資料抽象是一種僅向使用者 暴露接口而把具體的實作細節隐藏起來的機制。
簡而言之:
封裝是函數與資料在一起進行封裝。
抽象是僅僅将接口暴露,細節隐藏。
記憶體管理
為何要進行記憶體管理?
C++程式中的記憶體空間有哪兩個部分?
C++程式如何進行記憶體管理?
new和malloc的差別是什麼?
主要差別:
1.使用new操作符申請記憶體配置設定時 無須指定記憶體塊的大小,編譯器會根據類型資訊自行計算;malloc則 需要顯式地指出所需記憶體的尺寸。
2.new和delete是關鍵字,需要 編譯器支援;malloc和free是庫函數,需要 頭檔案支援;
3.new操作符記憶體配置設定成功時,傳回的是 對象類型的指針;而malloc記憶體配置設定成功則是傳回 void*,是以,malloc的傳回值一般都需要進行類型轉換。
4.new如果配置設定失敗了就會抛出 bad_malloc的異常,而malloc失敗了則會 傳回NULL。
5.C++ 允許重載new/delete操作符, malloc不允許重載。
高頻面試題彙總
- extern的作用是什麼?
- static的作用是什麼?
- const的作用是什麼?
-
指針與引用的差別是什麼?
答:
①引用必須被初始化,指針不必。
②引用初始化以後不能被改變,指針可以改變所指的對象。
③不存在指向空值的引用,但是存在指向空值的指針。
- new與malloc的差別是什麼?
- C++的多态性指什麼?
- 内聯函數,宏定義和普通函數的差別?
- 數組指針和指針數組的差別
- C++中類與結構體的差別?
- 析構函數的作用?
- 虛函數的作用?
- c語言和c++有什麼差別?
- 記憶體溢出,記憶體洩漏的原因?
- 函數參數傳遞中值傳遞、位址傳遞、引用傳遞有什麼差別?
-
連結清單和數組的差別在哪裡?
答:
數組:資料順序存儲,固定大小;
連結清單:資料可以随機存儲,大小可動态改變。
- C++重寫、重載、重定義的差別?
- 請說出STL标準模闆庫中的幾個常用類?
- 面向對象的三大特征是什麼?
- 構造函數與析構函數的異同點
- 簡述C++異常處理方式
- 成員函數和友元函數的差別?
-
局部變量能否和全局變量重名?
答:
能,局部會屏蔽全局。要用全局變量,需要使用"::";
局部變量可以與全局變量同名,在函數内引用這個變量時,會用到同名的局部變量,而不會用到全局變量;
對于有些編譯器而言,在同一個函數内可以定義多個同名的局部變量,如:在兩個循環體内都定義一個同名的局部變量,而那個局部變量的作用域就在那個循環體内。
-
全局變量和局部變量在記憶體中是否有差別?如果有,是什麼差別?
答:
全局變量儲存在靜态資料庫,局部變量在堆棧。
-
堆棧溢出一般是由什麼原因導緻的?
答:
沒有回收垃圾資源。
-
如何引用一個已經定義過的全局變量?
答:
可以用引用頭檔案的方式,也可以用extern關鍵字。
如果用引用頭檔案方式來引用某個在頭檔案中聲明的全局變量,假定你将那個變寫錯了,那麼在編譯期間會報錯;
如果你用extern方式引用時,假定你犯了同樣的錯誤,那麼在編譯期間不會報錯,而在連接配接期間報錯。
-
Heap與stack的差别?
答:
Heap是堆,stack是棧。
Stack的空間由作業系統自動配置設定/釋放,Heap的空間手動配置設定/釋放;
Stack空間有限,Heap是很大的自由存儲區;
C中的malloc函數配置設定的記憶體空間即在堆上,C++中對應的是new操作符。
程式在編譯期對變量和函數配置設定記憶體都在棧上進行,且程式運作過程中函數調用時參數的傳遞也在棧上進行。