C 學習筆記三

2021-09-06 13:38:08 字數 2659 閱讀 5724

1.檔案和流

2.c++動態記憶體分配

malloc()函式在 c 語言中就出現了,在 c++ 中仍然存在,但建議盡量不要使用 malloc() 函式。new 與 malloc() 函式相比,其主要的優點是,new 不只是分配了記憶體,它還建立了物件。在任何時候,當您覺得某個已經動態分配記憶體的變數不再需要使用時,您可以使用 delete 操作符釋放它所占用的記憶體。

double* pvalue = null; // 初始化為 null 的指標

pvalue = new double; // 為變數請求記憶體

delete pvalue; // 釋放記憶體

char* pvalue  = null;   // 初始化為 null 的指標

pvalue = new char[20]; // 為變數請求記憶體

delete pvalue; // 刪除 pvalue 所指向的陣列

box* myboxarray = new box[4];

delete myboxarray; // 刪除陣列

delete 與 delete 區別:

針對簡單型別 使用 new 分配後的不管是陣列還是非陣列形式記憶體空間用兩種方式均可 如:

int *a = new int[10];   

delete a;

delete a;

針對類class,兩種方式體現出具體差異

// 僅釋放了a指標指向的全部記憶體空間 但是只呼叫了a[0]物件的析構函式 剩下的從a[1]到a[9]這9個使用者自行分配的m_cbuffer對應記憶體空間將不能釋放 從而造成記憶體洩漏

delete a;

// 呼叫使用類物件的析構函式釋放使用者自己分配記憶體空間並且   釋放了a指標指向的全部記憶體空間

delete a;

對於像 int/char/long/int*/struct 等等簡單資料型別,由於物件沒有 destructor,所以用 delete 和 delete 是一樣的!但是如果是c++ 物件陣列就不同了!

new 和 malloc 內部的實現方式有什麼區別?

new 的功能是在堆區新建乙個物件,並返回該物件的指標。

所謂的【新建物件】的意思就是,將呼叫該類的建構函式,因為如果不構造的話,就不能稱之為乙個物件。

而 malloc 只是機械的分配一塊記憶體,如果用 mallco 在堆區建立乙個物件的話,是不會呼叫建構函式的。

嚴格說來用 malloc 不能算是新建了乙個物件,只能說是分配了一塊與該類物件匹配的記憶體而已,然後強行把它解釋為【這是乙個物件】,按這個邏輯來,也不存在建構函式什麼事。

同樣的,用 delete 去釋放乙個堆區的物件,會呼叫該物件的析構函式。

用 free 去釋放乙個堆區的物件,不會呼叫該物件的析構函式。

3.c++ 命名空間

4.c++ 預處理器

預處理器是一些指令,指示編譯器在實際編譯之前所需完成的預處理。

所有的預處理器指令都是以井號(#)開頭,只有空格字元可以出現在預處理指令之前。預處理指令不是 c++ 語句,所以它們不會以分號(;)結尾。

#define 預處理指令用於建立符號常量。該符號常量通常稱為巨集,指令的一般形式是:  #define pi 3.14159

有幾個指令可以用來有選擇地對部分程式源**進行編譯。這個過程被稱為條件編譯。

條件預處理器的結構與 if 選擇結構很像。請看下面這段預處理器的**:

#ifdef null

#define null 0

#endif

#ifdef debug

cerr <<"variable x = " << x << endl;

#endif

#if 0

不進行編譯的**

#endif

4.c++訊號處理;

訊號是由作業系統傳給程序的中斷,會提早終止乙個程式。在 unix、linux、mac os x 或 windows 系統上,可以通過按 ctrl+c 產生中斷。

有些訊號不能被程式捕獲,但是下表所列訊號可以在程式中捕獲,並可以基於訊號採取適當的動作。這些訊號是定義在 c++ 標頭檔案 中。

// 註冊訊號 sigint 和訊號處理程式

signal(sigint, signalhandler);

用函式 raise() 生成訊號,該函式帶有乙個整數訊號編號作為引數,語法如下:
int raise (signal sig);在這裡,sig 是要傳送的訊號的編號,這些訊號包括:sigint、sigabrt、sigfpe、sigill、sigsegv、sigterm、sighup
6.c++多執行緒

多執行緒是多工處理的一種特殊形式,多工處理允許讓電腦同時執行兩個或兩個以上的程式。一般情況下,兩種型別的多工處理:基於程序和基於執行緒

多執行緒程式包含可以同時執行的兩個或多個部分。這樣的程式中的每個部分稱為乙個執行緒,每個執行緒定義了乙個單獨的執行路徑。

C 學習筆記(三)

c 運算子過載 1 過載運算子的運算順序和優先順序不變,但引數和返回型別是可以重新說明的。2 c 規定,運算子中,引數說明都是內部型別的,不能過載,如 int operator int,int 3 c 還規定了 這五個運算子不能過載,也不能創造新的運算子,如 4 c 規定 這四種運算子必須為成員形式...

C 學習筆記(三)

chapter 3 函式和類的自頂向下設計 1 乙個程式的開發過程 1.問題規範 2.分析 資料需求 3.設計 初始演算法 演算法精化 4.實現 5.測試 2 重要工具 結構圖 3 分析,設計程式時,甚至對任何問題來說,我們都要由大到小,層層分解,由乙個大問題分割成多個相關 的小問題,一口乙個蛋糕是...

C 學習筆記(三)

attributes field modifiers type variable declarators 域的修飾符field modifiers可以是 靜態域和非靜態域 下面的例子清晰的反映了二者之間的區別 域的初始化 如果在類中,沒有顯式的對域進行初始化,系統將賦予其乙個預設值。域的預設初始化分...