6 章 函式
15 章 物件導向程式設計
16章 模板與泛型程式設計
演算法題c++有哪些性質?
封裝、繼承、多型static關鍵字封裝:實現了類的介面和實現的分離,隱藏類的具體實現,只提供給使用者介面。可以通過訪問說明符實現(public、private、protected)
繼承:從父類得到已有的特性,拓展已存在的**,實現**的復用。
多型:乙個介面 多個方法;動態多型、靜態多型。
const定義的常量在超出其作用域之後其空間會被釋放,而static定義的靜態常量在函式執行後不會釋放其儲存空間。全域性變數和區域性變數有什麼區別?是怎麼實現的?作業系統和編譯器是怎麼知道的?static表示的是靜態的。類的靜態成員函式、靜態成員變數是和類相關的,而不是和類的具體物件相關的。即使沒有具體物件,也能呼叫類的靜態成員函式和成員變數。在c++中,static靜態成員變數不能在類的內部初始化。在類的內部只是宣告,定義必須在類定義體的外部,通常在類的實現檔案中初始化,如:double account::rate = 2.25;static關鍵字只能用於類定義體內部的宣告中,定義時不能標示為static
在c++中,const成員變數也不能在類定義處初始化,只能通過建構函式初始化列表進行,並且必須有建構函式。
const資料成員 只在某個物件生存期內是常量,而對於整個類而言卻是可變的。因為類可以建立多個物件,不同的物件其const資料成員的值可以不同。所以不能在類的宣告中初始化const資料成員,因為類的物件沒被建立時,編譯器不知道const資料成員的值是什麼。
const資料成員的初始化只能在類的建構函式的初始化列表中進行。要想建立在整個類中都恆定的常量,應該用類中的列舉常量來實現,或者static const。
區別:基類的析構函式不是虛函式,會帶來什麼影響?1.宣告週期不同,全域性變數從程式開始到結束、 區域性變數在函式內部。
2.使用方式不同,全域性變數在整個程式都可使用,區域性變數只能在區域性使用
作業系統通過記憶體分配的位置判斷,全域性變數分配在全域性區,區域性變數分配在棧區。
node:記憶體四區
資料區:主要包括靜態全域性區和常量區,用來存放全域性區變數和靜態變數。全域性區存放全域性變數和靜態變數,常量區存放常量
棧 區:由編譯器自動分配釋放,存放函式的引數值、區域性變數等。操作類似資料結構中的棧
堆 區:由程式設計師分配釋放(動態記憶體),若程式設計師不釋放由系統**
**區:存放函式體的二進位制**
派生類的析構函式用不上,會造成記憶體洩露記憶體的分配有哪幾種?
1.靜態區建立:在編譯過程就分配好了,如全域性變數,在整個程式執行期間都存在。
2.棧上創 建:函式執行時建立,如區域性變數,在函式結束時釋放。
3.堆上創 建:動態記憶體分配,需要時用malloc或new申請記憶體,用過後用free或delete釋放
new/delete 與malloc/free的區別與聯絡 [禾多]
1. 定義不同
molloc/free為c的【標準庫函式】 函式原型:
void
*malloc
(size_t size)
//引數代表位元組個數
void free (
void
* pointer)
//引數代表記憶體位址
new和delete為c++的操作運算子,他呼叫的分別是賦值【運算子過載】operator new()和operator delete()
2. 使用方式不同
//-- molloc/free
//開闢乙個空間
int* p1=
(int*)
malloc
(sizeof
(int))
;//分配記憶體
if(p1==
null
)exit(1
);free
(p1)
;//釋放記憶體
//開闢多個空間
int p2=
(int*)
malloc
(sizeof
(int)*
4);if
(p2==
null
)exit(1
);free
(p2)
;
//-- new/delete
// 開闢乙個空間
int* p1 =
newint(1
);delete p1;
//開闢多個空間
int* p2=
newint[4
];delete
p2;
由此可知:
(1) malloc 返回的是 void* 需要強制轉換,new返回對應型別的指標
(2)malloc 需要檢擦記憶體是否為空,因為開闢失敗會返回null;new不用,因為分配失敗會丟擲異常
(3)無論釋放幾個空間大小,free只傳遞指標,多個物件時delete加[ ]
delete 釋放多個物件需要加 的原因?
malloc/free為函式只是開闢空間並釋放,new/delete則不僅會開闢空間,並呼叫建構函式和析構函式進行初始化和清理,
new/delete實現機制:
new/delete實現機制:
即過程如上,在開闢大小會多開闢四個位元組,用於存放物件的個數,在返回位址時則會向後偏移4個位元組,而在delete時則會檢視記憶體上物件個數,從而根據個數count確定呼叫幾次析構函式,從而完全清理所有物件占用記憶體。
對於內建型別若new但用delete釋放時,沒有影響,但若是自定義型別如類時,若釋放使用 delete時,這時則會只呼叫一次析構函式,只析構了乙個物件,剩下的物件都沒有被清理。
所以有一些說法:new在堆上分配記憶體,可以說是不太精確的。
1. 函式過載 [禾多]
定義:同一作用域內的幾個函式名字相同形參列表不同
條件:
node:函式返回值不是判斷函式過載的標準
1. 虛函式 [禾多]
定義:基類希望它的派生類各自定義適合自己的版本,此時基類就將這些函式宣告成虛函式(virtual function)
2. 多型 [禾多]
2.1 請談談你對多型的理解
多型實現的三個條件:繼承、虛函式重寫、父類指標指向子類物件(只能是父類指標指向子類物件)
多型的實現效果:同樣的呼叫語句有多種不同的表現形態
多型的c++實現:virtual關鍵字,告訴編譯器這個函式要支援多型;不是根據指標型別判斷如何呼叫,而是根據指標所指向的實際物件型別來判斷如何使用
2.2 c++編譯器如何實現多型
2.3 談談對重寫、過載的理解
函式過載:
函式重寫:
定義——在子類中定義與父類完全相同的函式
2.4 是否可以為每個成員函式都宣告虛函式,為什麼
2.5 建構函式中呼叫虛函式能實現多型嗎? 為什麼
2.6 虛函式表指標被編譯器初始化過程,你是如何理解的
2.7父類的建構函式中呼叫虛函式,能發生多型嗎
2.8 為什麼要定義虛析構函式?
建構函式不能是虛函式,建立乙個派生類物件時,必須從類層次的根開始,沿著繼承路徑逐個呼叫類的建構函式。
虛構函式可以是虛的,虛析構函式用於指引delete運算子正確析構動態物件。這樣做是為了當用乙個基類的指標刪除乙個派生類的物件時,派生類的析構函式會被呼叫
參考1參考2
2.9 為什麼要引入多型?
子類中定義與父類相同的函式:1.父類中的函式依然會繼承給子類 2.子類函式將隱藏父類函式 3.用域作用符::可以訪問父類函式。
新的需求:1. 父類指標指向子類物件,呼叫子類函式;2.父類指標指向父類物件,呼叫父類函式
2.10 多型的理論基礎
靜態聯編和動態聯編
聯編:**快之間的關聯
靜態聯編:**編譯階段,建立的關聯
動態聯編:**執行階段,建立的關聯
1. 實現和分離必須放在同乙個檔案?
c++ 中的模板類宣告標頭檔案和實現檔案分離後,如何能實現正常編譯?
c++模板宣告定義分離編譯錯誤詳解
2. 基類析構函式 [禾多]
字串翻轉 [禾多]
題目:malop => lopma
參考blog
[1] new/delete與malloc/free的區別與聯絡詳解!
C 基礎面試題
c c struct aa int a char b struct student 純虛函式的定義形式 virtual 0 在虛函式和純虛函式的定義中不能有static識別符號,原因很簡單,被static修飾的函式在編譯時候要求前期bind,然而虛函式卻是動態繫結 run time bind 而且被...
C 基礎經典面試題
1.請問以下 有什麼問題 int main 沒有為str分配記憶體空間,將會發生異常 問題出在將乙個字串 複製進乙個字元變數指標所指位址。雖然可以正確輸出結果,但因為越界進行記憶體讀寫而導致程式崩潰。char s aaa printf s s s 0 b printf s s 有 什麼錯?aaa 是...
C 基礎面試題(一)
1.簡答介紹物件的構成,並做出說明 物件的構成 屬性,方法,事件 屬性 乙個物件與生俱來的,方法 乙個物件的主動行為,事件 乙個物件的被動行為 2.c 中15中屬性型別分別是哪些 值型別 整數8種 byte,sbyte,short,ushort,int,uint,long,ulong,小數三種 fl...