第5課 新的關鍵字

2021-07-29 15:31:47 字數 2639 閱讀 1791

動態記憶體分配

c++中的動態記憶體分配

(1)c++中通過new關鍵字進行動態記憶體申請

(2)c++中的動態記憶體申請是基於型別進行的

(3)delete關鍵字用於記憶體釋放

變數申請:

type* pointer =new type;

delete pointer;

陣列申請:

type* pointer =new type[n];

delete  pointer;

c語言中的動態記憶體分配是用c語言標準庫中的malloc和free兩個函式來進行的,他倆是標準庫提供的函式,所以他倆不是c語言中的一部分,只是標準庫的一部分。

c++新增了兩個關鍵字new和delete,他倆是c++中動態記憶體分配的關鍵字,是c++語言的一部分。

int main()

delete p;

return 0; }

new關鍵字與malloc函式的區別

(1)new關鍵字是c++的一部分,malloc是由c庫提供的函式

(2)new以具體型別為單位進行記憶體分配,malloc只能以位元組為單位進行記憶體分配

(3)new在申請單個型別變數時可以進行初始化,malloc不具備記憶體初始化特性

new關鍵字初始化

int main()

c++中的命名空間

1.在c語言中只有乙個全域性作用域

(1)c語言中所有的全域性識別符號共享同乙個作用域:識別符號之間可能發生衝突。

2.c++中提出了命名空間的概念

(1)命名空間將全域性作用域分成不同的部分;

(2)不同命名空間中的識別符號可以同名而不會發生衝突;

(3)命名空間可以相互巢狀;

(4)全域性作用域也叫預設命名空間。

3.c++命名空間定義:

namespace name

namespace first

namespace second ;

} }c++命名空間的使用:

(1)使用整個命名空間:using namespace name;

(2)使用命名空間中的變數:using name::variable;

(3)使用預設命名空間中的變數:  ::variable

預設情況下可以直接使用預設命名空間中的所有識別符號。

c++命名空間的使用:

namespace first

namespace second ;

} }int main() ;

printf("p.x=%d\n",p.x);

printf("p.y=%d\n",p.y);

return 0; }

強制型別轉換

1.c方式強制型別轉換

(type)(expression) or type(expression)

typedef void(pf)(int);

struct point ;

int main()

編譯沒有出錯,執行出錯

c方式的強制型別轉換存在的問題

(1)過於粗暴:任意型別之間都可以進行轉換,編譯器很難判斷其正確性;

(2)難於定位:在原始碼中無法快速定位所有強制型別轉換的語句;

在程式設計理論中強制型別轉換時不被推薦的,與goto語句一樣,應該盡量避免。

現代軟體產品中有三個大問題是bug的源泉:(1)運算子優先順序;(2)多執行緒程式設計的時候各執行緒之間的互動;(3)強制型別轉換。

強制型別轉換在實際工程中還是可能使用的,如何進行更加安全可靠的轉換?

c++將強制型別轉換分為四種不同的型別

static_cast

const_cast

dynamic_cast

reinterpret_cast

用法:***_cast(expression)

type是最終要轉換的目標

static_cast強制型別轉換

(1)用於基本型別之間的轉換,但不能用於基本型別指標間的轉換

(2)用於有繼承關係類物件之間的轉換和類指標之間的轉換

int main()

static_cast是編譯期進行轉換的,無法在執行時檢測型別,所以類型別之間的轉換可能存在風險。

const_cast強制型別轉換:用於去除變數的const屬性

reinterpret_cast強制型別轉換:

(1)用於指標之間的強制型別轉換

(2)用於整數和指標型別之間的強制轉換

typedef void(pf)(int)

int main()

reinterpret_cast直接從二進位制位進行複製,是一種極其不安全的轉換。

dynamic_cast強制型別轉換

(1)主要用於類層次間的轉換,還可以用於類之間的交叉轉換

(2)dynamic_cast具有型別檢查功能,比static_cast更安全

小結(1)c++中內建了動態記憶體分配的專用關鍵字;

(2)c++中的動態記憶體分配是基於型別進行的;

(3)c++中的命名空間概念用於解決名稱衝突的問題;

(4)c++細化了c語言中強制型別轉換的方式

-----c++中不推薦在程式中使用強制型別轉換

-----c++中建議在強制型別轉換時考慮一下究竟希望什麼樣的轉換

C 第三課 新的關鍵字

一 動態分配記憶體的時的關鍵字 注意在c 中和c不一樣的是,在c中使用的malloc來動態分配記憶體,而這個malloc只是標準c庫的呼叫,所以這個不屬於標準c的範疇,而在c 中卻有真正的關鍵字來分配記憶體,而這個關鍵字就是new,相應的釋放記憶體的關鍵字是delete。動態記憶體分配關鍵字使用示例...

c 新關鍵字詳解

alignof用於獲取取指定表示式指定的 類似sizeof,可以直接是型別名 的對齊 alignment alignas用於宣告時指定對齊類似於現有的型別。和sizeof類似,兩者的運算元都不被求值。類似const但更強大,修飾函式或物件,表示函式結果或物件是編譯時決定的常量,以便優化。const不...

新的關鍵字(記錄 理解)

變數申請 type pointer new type delete pointer 陣列申請 type pointer new type n delete pointer int main delete p 將p指向的堆空間中的整個陣列大小 10個int大小記憶體 釋放 如果只是delete p 則...