c++有三種方法創建對象
結合代碼來看
1 #include <iostream> 2 using namespace std; 3 class Test { 4 5 private: 6 public: 7 add() 8 { 9 int x,y,sum; 10 x=5; 11 y=5; 12 sum=x+y; 13 cout<<sum<<endl; 14 } 15 }; 16 void main() 17 { 18 Test test1; //棧中分配 ,由操作系統進行內存的分配和管理 19 Test test2 = Test; //棧中分配 ,由操作系統進行內存的分配和管理 20 Test *test3=new Test(); //堆中分配 ,由管理者進行內存的分配和管理,用完必須delete(),否則可能造成內存泄漏 21 test1.add(); 22 test2.add();//"." 是結構體成員引用
23 test3->add();//"->"是指針引用 24 delete(test3); 25 system("pause"); 26 }
第一種和第二種沒什么區別,一個隱式調用,一個顯式調用,兩者都是在進程虛擬地址空間中的棧中分配內存。棧是系統數據結構,對於線程/進程是唯一的,它的分配和釋放由操作系統決定,不需要由開發者來管理。在執行函數時,函數內局部變量的存儲單元可以在棧上創建,函數執行完畢,系統會自動釋放這些存儲單元。第三種使用了new,在堆中分配了內存,堆上的內存分配,亦稱動態內存分配。程序在運行的期間用malloc申請的內存,這部分內存由程序員自己負責管理,其生存期由開發者決定:在何時分配,分配多少,並在何時用free來釋放該內存。這是唯一可以由開發者參與管理的內存。使用的好壞直接決定系統的性能和穩定。注意:棧中內存的分配和管理由操作系統決定,而堆中內存的分配和管理由管理者決定。
我們需要的內存很少,你又能確定你到底需要多少內存時,用棧。當你需要在運行時才知道你到底需要多少內存時,請用堆。
關於new創建類對象特點:
- new創建類對象需要指針接收,一處初始化,多處使用
- new創建類對象使用完需delete銷毀
- new創建對象直接使用堆空間,而局部不用new定義類對象則使用棧空間
- new對象指針用途廣泛,比如作為函數返回值、函數參數等
- 頻繁調用場合並不適合new,就像new申請和釋放內存一樣