C++語言筆試題目
- C和C++中struct有什麼差別?
Protection行為 | 能否定義函數 | |
---|---|---|
C | 無 | 否,但可以有函數指針 |
C++ | 有,預設是****private | 可以 |
- C++中virtual與inline的含義分别是什麼?
虛函數的特點:如果希望派生類能夠重新定義基類的方法,則在基類中将該方法定義為虛方法,這樣可以啟用動态聯編。
内聯函數的特點;使用内聯函數的目的是為了提高函數的運作效率。内聯函數體的代碼不能過長,因為内聯函數省去調用函數的時間是以代碼膨脹為代價的。内聯函數不能包含循環語句,因為執行循環語句要比調用函數的開銷大。
- 引用和指針的差別
(1)引用被建立的同時必須被初始化(指針則可以在任何時候被初始化) 。
(2)不能有 NULL 引用,引用必須與合法的存儲單元關聯(指針則可以是 NULL) 。
(3)一旦引用被初始化,就不能改變引用的關系(指針則可以随時改變所指的對象) 。
- 有了 malloc/free 為什麼還要 new/delete ?
malloc 與 free 是 C++/C 語言的标準庫函數,new/delete 是 C++的運算符。它們都可用于申請動态記憶體和釋放記憶體。 對于非内部資料類型的對象而言,光用 malloc/free 無法滿足動态對象的要求。對象在建立的同時要自動執行構造函數,對象在消亡之前要自動執行析構函數。由于malloc/free 是庫函數而不是運算符,不在編譯器控制權限之内,不能夠把執行構造函數和析構函數的任務強加于 malloc/free。 是以 C++語言需要一個能完成動态記憶體配置設定和初始化工作的運算符 new,以及一個能完成清理與釋放記憶體工作的運算符 delete。注意 new/delete 不是庫函數。
- C++是不是類型安全的?
不是。兩個不同類型的指針之間可以強制轉換(用reinterpret cast)。
-
- void * ( * (**fp1)(int))[10]:fp1是一個指針,指向一個函數,這個函數的參數為int型,函數的傳回值是一個指針,這個指針指向一個數組,這個數組有10個元素,每個元素是一個void*型指針。
- float (**(* *fp2)(int,int,int))(int): fp2是一個指針,指向一個函數,這個函數的參數為3個int型,函數的傳回值是一個指針,這個指針指向一個函數,這個函數的參數為int型,函數的傳回值是float型。
- int (* ( * fp3)())[10] (): fp3是一個指針,指向一個函數,這個函數的參數為空,函數的傳回值是一個指針,這個指針指向一個數組,這個數組有10個元素,每個元素是一個指針,指向一個函數,這個函數的參數為空,函數的傳回值是int型。
- 多态類中的虛函數表是Compile-Time,還是Run-Time時建立的?
虛函數表是在編譯期就建立了,各個虛拟函數這時被組織成了一個虛拟函數的入口位址的數組.而對象的隐藏成員–虛拟函數表指針是在運作期–也就是構造函數被調用時進行初始化的,這是實作多态的關鍵。
- In C++, what does “explicit” mean? what does “protected” mean?
explicit關鍵字用來修飾類的構造函數,表明該構造函數是顯式的,在某些情況下,我們要求類的使用者必須顯示調用類的構造函數時就需要使用explicit
protected成員隻有該類的成員函數及其派生類的成員函數可以通路。
- const關鍵字有哪些作用
(1)阻止變量被改變可使用const。定義該const變量時,需初始化,因為以後就沒有機會再去改變它了;
(2)對指針來說,可以指定指針本身為const,也可以指定指針所指的資料為const,或二者同時指定為const;
(3)在一個函數聲明中,const可以修飾形參,表明它是一個輸入參數,在函數内部不能改變其值;
(4)對于類的成員函數,若指定其為const類型,則表明其是一個常函數,不能修改類的成員變量;
(5)對于類的成員函數,有時候必須指定其傳回值為const類型,以使得其傳回值不為“左值”。
- 面向對象的三個基本特征,并簡單叙述之?
- 封裝:将客觀事物抽象成類,每個類對自身的資料和方法實行protection(private,protected,public)
- 繼承:廣義的繼承有三種實作形式:實作繼承(指使用基類的屬性和方法而無需額外編碼的能力)、可視繼承(子窗體使用父窗體的外觀和實作代碼)、接口繼承(僅使用屬性和方法,實作滞後到子類實作)。前兩種(類繼承)和後一種(對象組合=>接口繼承以及純虛函數)構成了功能複用的兩種方式。
- 多态:允許将子類類型的指針指派給父類類型的指針。
- 重載(overload)、重寫(override,有的書也叫做“覆寫”)、重定義(redefinition)的差別?
名稱 | 名字空間 | 差別 |
---|---|---|
重載 | 同一名字空間 | 是指允許存在多個同名函數,而這些函數的參數表不同。 |
重定義/隐藏 | 不同名字空間 | 用于繼承,派生類與基類的函數同名,屏蔽基類的函數 |
重寫/覆寫 | 不同名字空間 | 用于繼承,子類重新定義父類虛函數的方法 |
- 多态的作用?
- 隐藏實作細節,使得代碼能夠子產品化;擴充代碼子產品,實作代碼重用;
- 接口重用:為了類在繼承和派生的時候,保證使用家族中任一類的執行個體的某一屬性時的正确調用。
- 基類的析構函數不是虛函數,會帶來什麼問題?
派生類的析構函數用不上,造成記憶體洩漏
- 全局函數的構造函數會在main函數之前執行
- new is operator.
-
不使用額外參數交換兩個數的值
a = a + b;
b = a – b;
a = a – b;
- 請你談談你是如何使用return語句的。
(1)return 語句不可傳回指向“棧記憶體”的“指針”或者“引用” ,因為該記憶體在函數體結束時被自動銷毀。
(2)要搞清楚傳回的究竟是“值” 、 “指針”還是“引用” 。
(3)如果函數傳回值是一個對象,要考慮 return 語句的效率