1. 程式人生 > >c++知識點總結(不時更新)

c++知識點總結(不時更新)

【面向物件的概念】

世間萬物皆有屬性和方法,將這些封裝起來就是一個物件,面向物件程式設計思想總結起來其特點就是封裝,繼承,多型等,類的例項就是一個物件,類中資料成員,成員函式就是物件的屬性和操作,例項關係和繼承關係就是物件之間的靜態關係,而訊息傳遞就是物件之間的動態關係,多型實現了訊息傳遞時物件的反應動作,面向物件與面向過程不對立,相互補充,面向物件能夠解決更多複雜的問題,面向物件程式設計思想更能適用於大型軟體設計系統設計。

【記憶體分配】

棧區:
儲存函式的引數,區域性變數,程式的返回地址等,編譯器需要的時候會自動分配記憶體,不需要的時候會自動清除。
堆區:
由程式設計師分配和釋放,若程式設計師不釋放,程式結束時作業系統會釋放,分配方式類似於連結串列,動態分配的記憶體都是在這裡,new,malloc,需要用delete,free來釋放。
靜態區或者全域性區:


靜態變數和全域性變數都放在這裡,程式結束後系統釋放,初始化的靜態變數和全域性變數放在一塊,未初始化的放在相鄰的另一塊區域。
文字常量區:
常量字串,const型別不允許修改
程式程式碼區:
存放函式體的二進位制程式碼
參考:http://blog.csdn.net/hairetz/article/details/4141043

【堆和棧的區別】

1.從空間分配角度
在Windows下,棧是向低地址擴充套件的資料結構,是一塊連續的記憶體的區域,棧頂的地址和棧的最大容量是系統預先規定好的,能從棧獲得的空間較小,遍歷是從高地址向低地址,有作業系統自動分配並釋放,存放函式的引數值,區域性變數的值等,其操作方式類似於資料結構中的棧;

堆是向高地址擴充套件的資料結構,是不連續的記憶體區域。這是由於系統是用連結串列來儲存空閒記憶體地址的,自然是不連續的,而連結串列的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬記憶體。由此可見,堆獲得的空間比較靈活,也比較大,由程式設計師分配釋放,程式設計師若不釋放,程式結束時作業系統可能會釋放回收,new,malloc申請的動態空間都是在這裡儲存。

2.資料結構區別
棧:先進後出的資料結構;
堆:一棵完全二叉樹,分為大頂堆和小頂堆

3.快取方式區別
棧使用的是一級快取,通常被呼叫時處於儲存空間中,呼叫完畢後立即釋放;
堆是存放在二級快取中,生命週期由虛擬機器的垃圾回收演算法來決定。

【虛擬函式/純虛擬函式】

基類中vitual宣告的函式,期望派生類能夠重定義的虛擬函式,在派生類中此函式也是虛擬函式,vitual關鍵字在派生類中可以省略。用來實現多型的,純虛擬函式的意義是該函式為後代型別提供了可以覆蓋的介面,但是這個類中的版本是絕對不會呼叫,並且這個類不能夠建立物件,這個類的存在僅是為了讓其他類繼承。

【多型】

多型性是指相同的物件收到不同的訊息或者不同的物件收到相同的訊息時產生的不同的動作,僅用於通過繼承而相關聯的型別的引用或者指標,c++中,定義為虛擬函式是基類期盼派生類重定義實現多型的。

【const用法】

const修飾起到保護作用,可以宣告變數,指標,函式引數返回值等,它修飾過的就是不能被改變的

【c/c++分配和釋放記憶體區別】

c:
malloc/free,calloc,realloc均為函式
指標名=(資料型別*)malloc(要申請的記憶體大小sizeof(type))
指標名=(資料型別*)calloc(n,型別大小sizeof(type)),分配n個大小為size的連續記憶體。
指標名=(資料型別*)realloc(要改變記憶體大小的指標名,新的大小)

c++:
new/delete 為運算子

malloc與free是C++/C語言的標準庫函式,new/delete是C++的運算子。它們都可以用於申請動態記憶體和釋放記憶體。對於非內部資料型別物件而言,光用malloc/free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行解構函式。由於
malloc/free是庫函式而不是運算子,不在編譯器控制權限之內,不能夠把執行建構函式和解構函式的任務強加於malloc/free。

【解構函式、建構函式和虛擬函式關係】

【const、define區別】

【define和inline】

【野指標】

“野指標”不是NULL指標,而是指向“垃圾”的記憶體指標,其主要成因是:指標變數沒有被初始化,或者指標p被free或者delete之後,沒有置為NULL

【static用途】
1)在函式體,一個被宣告為靜態的變數在這一函式被呼叫過程中維持其值不變。

2) 在模組內(但在函式體外),一個被宣告為靜態的變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問。它是一個本地的全域性變數。

3) 在模組內,一個被宣告為靜態的函式只可被這一模組內的其它函式呼叫。那就是,這個函式被限制在宣告它的模組的本地範圍內使用