天天看點

計算機考研複試【C++重點知識筆記&面試題】C++簡介C++程式C++存儲類指針與引用類和對象繼承重載多态資料封裝資料抽象記憶體管理高頻面試題彙總

前言:

  考研複試面試時經常會問到一些程式設計語言的基礎知識,尤其C++面向對象這一塊,為了避免會用不會說的情況,本文作為個人筆記用最精煉的語言梳理了複試面試常考察的知識點(後附高頻面試題),個人這塊概念知識比較薄弱,複試前保下命ヾ(◍°∇°◍)ノ゙

參考資料

   C++教程|菜鳥教程

   網絡上各位大牛的博文

本文知識架構

  • C++簡介
  • C++程式
  • C++存儲類
  • 指針與引用
  • 類和對象
  • 繼承
  • 重載
  • 多态
  • 資料封裝
  • 資料抽象
  • 記憶體管理
  • 高頻面試題彙總

C++簡介

C++是什麼?

C++ 是一種 靜态類型的、 編譯式的程式設計語言,支援 過程化程式設計、 面向對象程式設計。
(靜态類型的程式設計語言是在編譯時執行類型檢查,而不是在運作時執行類型檢查。)

引入目的是什麼?

面向對象是相對于面向過程來講的,它把 資料和方法組織為一個整體來看待,更像事物的本身的運作模式。

三個組成

核心語言:所有構件塊,包括變量、資料類型和常量等。

C++ 标準庫:提供了大量的函數,用于操作檔案、字元串等。

标準模闆庫(STL):提供了大量的方法,用于操作資料結構等。

四大特性(重點考察點)

封裝

繼承

多态

抽象

(問三大特性,回答前三個即可)

C++程式

C++程式是什麼?

C++ 程式可以定義為對象的集合,這些對象通過調用彼此的方法進行互動。

基本文法包括哪幾類?

對象:對象具有 狀态和 行為。如:某一隻白色的正在叫喚的貓。對象是類的執行個體。

類:描述對象行為/狀态的 模闆。如:這一類白色正在叫喚的貓;

方法:從基本上說, 一個方法表示一種行為。一個類可以包含多個方法。

即時變量 :每個對象都有其獨特的即時變量。對象的狀态是由這些即時變量的值建立的。

C++存儲類

存儲類是什麼?

存儲類定義C++程式中變量/函數的 可見範圍和 生命周期。

重要的幾種存儲類

auto

static

extern

auto存儲類

用于兩種情況:

1.聲明變量時根據初始化表達式 自動推斷該變量的類型;

2.聲明函數時函數傳回值的占位符。

static存儲類

使用 static 修飾局部變量可以在函數調用之間 保持局部變量的值,而不需要在每次它進入和離開作用域時進行建立和銷毀。

extern存儲類

用于提供 一個全局變量的引用,全局變量對所有的程式檔案都是可見的。可以這麼了解,extern是用來在另一個檔案中聲明一個全局變量或函數。

指針與引用

什麼是指針?

指針是一個 變量,其值為另一個變量的位址。

什麼是引用?

引用變量是一個 别名(類似綽号),一旦把引用初始化為某個變量,就可以使用該引用名稱或變量名稱來指向變量。

指針和引用有何差別?(主要差別)

初始化

引用必須在建立時被初始化;

指針可以在任何時間被初始化;

是否可變

引用隻能在定義時被初始化一次(從一而終),之後不可變;

指針可變;

是否可為空

引用不能為空,引用必須連接配接到一塊合法的記憶體;

指針可以為空。

類和對象

類是什麼?

類用于指定對象的形式,它包含了資料表示法和用于處理資料的方法。類中的資料和方法稱為類的成員。函數在一個類中被稱為類的成員。

對象是什麼?

對象是根據類來建立的。聲明類的對象,就像聲明基本類型的變量一樣。

類的成員函數是什麼?

是指那些把定義和原型寫在類定義内部的函數,就像類定義中的其他變量一樣。

類通路修飾符是什麼?

資料封裝是面向對象程式設計的一個重要特點,它防止函數直接通路類的内部成員。類成員的通路限制是通過在類主體内部對各個區域标記 public、private、protected 來指定的,即:通路修飾符。

公有成員public

公有成員在程式中類的外部是可通路的。

私有成員private

私有成員變量或函數在類的外部是不可通路的。隻有類和友元函數可以通路私有成員。(預設情況下,類的所有成員都是私有的)

保護成員protected

保護成員變量或函數與私有成員有一點不同:保護成員在派生類中是可通路的。

類構造函數是什麼?

類的構造函數是類的一種特殊的成員函數。
使用:它會在每次建立類的新對象時執行。
用途:構造函數可用于為某些成員變量設定初始值。

類析構函數是什麼?

類的析構函數是類的一種特殊的成員函數。
使用:它會在每次删除所建立的對象時執行。
用途:析構函數有助于在跳出程式(比如關閉檔案、釋放記憶體等)前釋放資源。

友元函數

類的友元函數是定義在類外部,但有權通路類的所有private成員和protected成員;
友元函數并不是成員函數;
友元可以是一個函數,該函數被稱為友元函數;友元也可以是一個類,該類被稱為友元類,在這種情況下,整個類及其所有成員都是友元。

内聯函數

引入目的:是為了解決程式中函數調用的效率問題,是個空間代價換時間的節省。
原理:程式在編譯器編譯的時候,編譯器将程式中出現的内聯函數的調用表達式用内聯函數的函數體進行替換,而對于其他的函數,都是在運作時候才被替代。
使用:是以内聯函數一般都是1-5行的小函數。

this指針

C++中每一個對象都能通過this指針來通路自己的位址。this指針是所有成員函數的隐含參數。
使用:在成員函數内部,它可以用來指向調用對象。
注意:友元函數沒有this指針,因為友元不是類的成員。隻有成員函數才有 this 指針。

static靜态成員

使用 static 關鍵字來把類成員定義為靜态的。當我們聲明類的成員為靜态時,這意味着無論建立多少個類的對象,靜态成員都隻有一個副本。
不會在對象銷毀時銷毀,是以生命周期較長。

靜态成員函數

如果把函數成員聲明為靜态的,靜态成員函數即使在類對象不存在的情況下也能被調用。
靜态成員函數隻能通路靜态成員資料、其他靜态成員函數和類外部的其他函數。

靜态成員函數與普通成員函數的差別:

靜态成員函數沒有this指針,隻能通路靜态成員
普通成員函數有this指針,可以通路類中的任意成員;而靜态成員函數沒有this指針。

繼承

什麼是繼承?

當建立一個類時,不需要重新編寫新的資料成員和成員函數,隻需指定建立的類繼承了一個已有的類的成員即可。這個已有的類稱為基類,建立的類稱為派生類。

引入目的是什麼?

繼承允許我們依據另一個類來定義一個類,這使得建立和維護一個應用程式變得更容易。這樣做也達到了重用代碼功能和提高執行效率的效果。

通路控制和繼承

派生類可以通路基類中所有的非私有成員。是以基類成員如果不想被派生類的成員函數通路,則應在基類中聲明為private。

一個派生類繼承了所有的基類方法,但下列情況除外:

基類的構造函數、析構函數和拷貝構造函數。

基類的重載運算符。

基類的友元函數。

繼承類型有哪幾種?

公有繼承、保護繼承、私有繼承

繼承中有哪些特點?

三種繼承方式相應地改變了基類成員的通路屬性。無論哪種繼承方式,有兩點都沒有改變:

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

重載

重載是什麼?

C++ 允許在 同一作用域中的某個函數和運算符 指定多個定義,分别稱為函數重載和運算符重載。

重載聲明是什麼?

重載聲明是指一個與之前已經在該作用域内聲明過的函數或方法具有相同名稱的聲明,但是它們的參數清單和定義(實作)不相同。

重載決策是什麼?

當調用一個重載函數或重載運算符時,編譯器通過把你所使用的參數類型與定義中的參數類型進行比較, 決定選用最合适的定義,該過程稱為重載決策。

函數重載

在 同一個作用域内,可以聲明幾個功能類似的 同名函數,但是這些同名函數的 形式參數(指參數的個數、類型或者順序)必須不同。不能僅通過傳回類型的不同來重載函數。

運算符重載

可以重定義或重載大部分 C++内置的運算符。這樣就能使用 自定義類型的運算符。

多态

什麼是多态?

當類之間存在層次結構,并且類之間是 通過繼承關聯時,就會用到多态。C++ 多态意味着調用成員函數時,會對于 不同對象接收相同消息時産生不同的動作。

什麼時候涉及到多态?

C++的多态性具體展現在 運作和編譯兩個方面:在 程式運作時的多态性通過 繼承和虛函數來展現;在 程式編譯時多态性展現在 函數和運算符的重載上;

虛函數是什麼?

在基類中冠以關鍵字virtual的成員函數。 它提供了一種接口界面。

具體解釋可以看這個例子,講的還不錯: C++中虛函數的作用是什麼?

資料封裝

什麼是封裝?

封裝是面向對象程式設計中的 把資料和操作資料的函數綁定在一起的一個概念。

引入目的是什麼?

這樣能避免受到外界的 幹擾和誤用,進而確定了安全。資料封裝引申出了 資料隐藏的概念。

實作方法是什麼?

C++通過建立 類來支援封裝和資料隐藏(public、protected、private)。

資料抽象

什麼是抽象?

資料抽象是指,隻向外界提供關鍵資訊,并隐藏其背景的實作細節。

打個比方?

應用程式可以調用sort() 函數,而不需要知道函數中排序資料所用到的算法。

引入目的是什麼?

類的内部受到保護,不會因無意的使用者級錯誤導緻對象狀态受損;
類實作可能随着時間的推移而發生變化,以便 應對不斷變化的需求。

實作方法是什麼?

抽象把代碼分離為 接口和實作。是以在設計元件時,必須 保持接口獨立于實作,這樣,如果改變底層實作,接口也将保持不變。

資料抽象與資料封裝的差別是什麼?

資料封裝是一種把 資料和操作資料的函數捆綁在一起的機制,資料抽象是一種僅向使用者 暴露接口而把具體的實作細節隐藏起來的機制。

簡而言之:

封裝是函數與資料在一起進行封裝。

抽象是僅僅将接口暴露,細節隐藏。

記憶體管理

為何要進行記憶體管理?

很多時候,我們 無法提前預知需要多少記憶體來存儲某個定義變量中的特定資訊,所需記憶體的大小 需要在運作時才能确定。

C++程式中的記憶體空間有哪兩個部分?

棧:在 函數内部聲明的所有變量都将占用棧記憶體。
堆:這是程式中未使用的記憶體,在 程式運作時可用于動态配置設定記憶體。

C++程式如何進行記憶體管理?

配置設定:可以使用 new運算符為給定類型的變量在運作時配置設定堆内的記憶體,這會傳回所配置設定的空間位址。
回收:如果您不再需要動态配置設定的記憶體空間,可以使用 delete運算符,删除之前由new運算符配置設定的記憶體。

new和malloc的差別是什麼?

C語言提供了malloc和free函數,完成對堆記憶體的申請和釋放。而C++則提供了兩個關鍵字new和delete;

主要差別:

1.使用new操作符申請記憶體配置設定時 無須指定記憶體塊的大小,編譯器會根據類型資訊自行計算;malloc則 需要顯式地指出所需記憶體的尺寸。

2.new和delete是關鍵字,需要 編譯器支援;malloc和free是庫函數,需要 頭檔案支援;

3.new操作符記憶體配置設定成功時,傳回的是 對象類型的指針;而malloc記憶體配置設定成功則是傳回 void*,是以,malloc的傳回值一般都需要進行類型轉換。

4.new如果配置設定失敗了就會抛出 bad_malloc的異常,而malloc失敗了則會 傳回NULL。

5.C++ 允許重載new/delete操作符, malloc不允許重載。

高頻面試題彙總

  1. extern的作用是什麼?
  2. static的作用是什麼?
  3. const的作用是什麼?
  4. 指針與引用的差別是什麼?

    答:

    ①引用必須被初始化,指針不必。

    ②引用初始化以後不能被改變,指針可以改變所指的對象。

    ③不存在指向空值的引用,但是存在指向空值的指針。

  5. new與malloc的差別是什麼?
  6. C++的多态性指什麼?
  7. 内聯函數,宏定義和普通函數的差別?
  8. 數組指針和指針數組的差別
  9. C++中類與結構體的差別?
  10. 析構函數的作用?
  11. 虛函數的作用?
  12. c語言和c++有什麼差別?
  13. 記憶體溢出,記憶體洩漏的原因?
  14. 函數參數傳遞中值傳遞、位址傳遞、引用傳遞有什麼差別?
  15. 連結清單和數組的差別在哪裡?

    答:

    數組:資料順序存儲,固定大小;

    連結清單:資料可以随機存儲,大小可動态改變。

  16. C++重寫、重載、重定義的差別?
  17. 請說出STL标準模闆庫中的幾個常用類?
  18. 面向對象的三大特征是什麼?
  19. 構造函數與析構函數的異同點
  20. 簡述C++異常處理方式
  21. 成員函數和友元函數的差別?
  22. 局部變量能否和全局變量重名?

    答:

    能,局部會屏蔽全局。要用全局變量,需要使用"::";

    局部變量可以與全局變量同名,在函數内引用這個變量時,會用到同名的局部變量,而不會用到全局變量;

    對于有些編譯器而言,在同一個函數内可以定義多個同名的局部變量,如:在兩個循環體内都定義一個同名的局部變量,而那個局部變量的作用域就在那個循環體内。

  23. 全局變量和局部變量在記憶體中是否有差別?如果有,是什麼差別?

    答:

    全局變量儲存在靜态資料庫,局部變量在堆棧。

  24. 堆棧溢出一般是由什麼原因導緻的?

    答:

    沒有回收垃圾資源。

  25. 如何引用一個已經定義過的全局變量?

    答:

    可以用引用頭檔案的方式,也可以用extern關鍵字。

    如果用引用頭檔案方式來引用某個在頭檔案中聲明的全局變量,假定你将那個變寫錯了,那麼在編譯期間會報錯;

    如果你用extern方式引用時,假定你犯了同樣的錯誤,那麼在編譯期間不會報錯,而在連接配接期間報錯。

  26. Heap與stack的差别?

    答:

    Heap是堆,stack是棧。

    Stack的空間由作業系統自動配置設定/釋放,Heap的空間手動配置設定/釋放;

    Stack空間有限,Heap是很大的自由存儲區;

    C中的malloc函數配置設定的記憶體空間即在堆上,C++中對應的是new操作符。

    程式在編譯期對變量和函數配置設定記憶體都在棧上進行,且程式運作過程中函數調用時參數的傳遞也在棧上進行。

繼續閱讀