C++面向物件面試題知識點整理
a.程式設計是在計算機中反映世界
面向系統設計帶來的種種便利
(1)良好的可複用性
(2)易維護
(3)良好的可擴充性
b.以下選項中哪一個不是面向物件設計?
(1)面向物件設計的三原則:繼承,封裝,多型
(2)里氏代換原則是繼承複用的基石
(3)開閉原則是面向物件設計的重要特性之一,軟體對擴充套件應該是開放的,對修改應該是關閉的。
(4)防禦性程式設計知識一種程式設計技巧,與面向設計無關
c.什麼是封裝?
從字面意思來看,封裝就是把一些相關的東西打包成一坨,分裝最廣為人知的例子,就是在面向物件程式設計裡面,把資料和針對該資料的操作,統一到一個class裡面
interface屬於繼承,virtual屬於多型,private屬於封裝
d.C++中的空類預設產生哪些類成員函式?
對於一個空類,編譯器預設產生4個成員函式,預設建構函式,解構函式,複製建構函式,賦值函式
e.struct 和 class 的區別(簡單介紹)
區別是Class中的變數預設是private,struct中的變數預設是public。
struct可以有建構函式,解構函式,之間也可以繼承,C++中的struct其實和class意義一樣,唯一不同的是struct裡面的預設訪問許可權是public,class預設的訪問許可權是private。
C++中存在struct關鍵字的唯一意義就是為了讓C程式設計師有個歸屬感,是為了讓C++編譯器相容以前用C開發出來的專案。
f.哪一種成員變數可以在同一個類的例項之間實現共享?
必須使用靜態成員變數在一個類的所有例項之間共享資料
(1)如果想限制對靜態成員變數訪問,則必須把他們宣告為保護型或者私有型
(2)不允許用靜態成員變數去存放某一個物件的資料
(3)靜態成員資料是在這個類的所有物件之間共享的
g.如果要把靜態成員資料設為私有,該如何訪問?
通過公有靜態成員函式訪問。
注意:設定了靜態成員變數,要給靜態成員變數設定初值
h.初始化列表的初始化變數順序是根據成員變數的宣告順序來執行的。
i.虛擬函式
虛擬函式就是允許被其子類重新定義的成員函式。
虛擬函式採用了一種虛呼叫的方法,虛呼叫是一種可以在 只有部分資訊的 情況下 工作的機制,特別允許我們呼叫一個只知道介面而不知道其 準確型別的函式,但是如果要建立一個物件,你勢必要知道物件的準確型別,因此建構函式不能為空
j.虛擬函式是非常有效的,但不能把每一個函式都宣告為虛擬函式.
因為虛擬函式是有代價的,由於每個虛擬函式的物件都需要維護一個V表,因此使用虛擬函式時會產生額外的系統開銷,如果是一個很小的類,且不想派生其他的類,那麼根本沒有必要使用虛擬函式。
k.重寫和過載的區別?
子類重新定義父類虛擬函式的做法,稱為重寫。
重寫的函式必須有一致的引數表和返回值。
過載是指編寫一個與已有函式同名但是引數表不同的函式
l.巨集,行內函數,模板都可以在編譯時解析,但是虛擬函式不可以,他必須在執行時才能確定
m.多型:面向物件程式設計領域的核心概念。
多型可以簡單概括為“一個介面,多個實現”,在程式執行時才可以確定呼叫哪一個函式
多型時通過繼承和虛擬函式實現的。
n.解構函式也可以設為行內函數(可以通過程式碼嘗試實現)