在c++的類中,我若是要訪問類中的成員變量或函數,有2種方法,第一種就是定義一個一個對象,如:java
Class A ... A aa; aa.xxx();
另一種就是c++
Class B ... B *aa = new B(); aa->xxx();
在java中,A a = new A();
等同於c++中的 A a;
程序員
另外在c++中還有另一種聲明和實例化就是使用指針,如:A* a= new A();
,在Java中沒有對應的形式,最重要的緣由是C++中的這種聲明形式的內存是須要程序員手動管理的,可是Java有內存回收機制,不須要程序員關心對象的內存的問題。segmentfault
上面是從內存回收的角度看,這時候:在java中,A a = new A();
等同於c++中的 A a;
函數
可是假如從建立對象的時間來看:在java中,A a = new A();
也能夠當作等同於c++中的 A *a = New A();
指針
c++中的A a
;就已經構造了對象。可是在java中 A a
; 就只是聲明,可是尚未分配空間,java中的A a = new A()
纔是分配了內存的。而C++中的A *a;
也只是聲明瞭一個指針,可是尚未分配指針,a = new A();
纔是建立了一個實體,而且另指針a指向這個實體的內存地址!code
再說說Delphi,假若有一個類ClassA,而後聲明一個對象,代碼大概以下:對象
var ObjectA: ClassA; //這裏只是聲明瞭一個變量名,Delphi中變量名其實就是一個指針,此時並無分配空間 begin ObjectA:= ClassA.Create; //這裏纔是建立了一個內存實體,分配了內存空間,而且令ObjectA指向這塊內存地址 //注意這裏的語法格式不一樣於C++的ClassA *ObjectA = new ClassA(); //也不一樣於Java的ClassA ObjectA = new ClassA(); //注意區別三者的語法格式的不一樣 end;
在Delphi的面向對象的語法中,要注意理解Delphi對象名與對象實體的本質區別,一個Delphi的對象的對象名其實本質上就是一個指針,指向內存中的對象實體。內存
在C++中就很是的靈活,A a;是在棧(stack)上分配空間,是靜態的。而A * a= new A;是在堆(heap)上分配空間,是動態的。棧上空間自動回收,堆空間須要程序員手動回收get
靜態分配內存適合於編譯時就已經能夠肯定須要佔用內存多少的狀況,而在編譯時不能肯定內存需求量時可以使用動態分配內存;但靜態分配內存的運行效率要比動態分配內存的效率要高,由於動態內存分配與釋放須要額外的開銷;動態內存管理水平嚴重依賴於程序員的水平,若是處理不當容易形成內存泄漏。
動、靜態內存分配比較能夠知道動態內存分配相對於靜態內存分配的特色:
1)不須要預先分配存儲空間;
2)分配的空間能夠根據程序的須要擴大或縮小。
對於C++語言:
A a =new A(); //會報錯 A *a=new A(); //這樣是對的
詳細說明緣由:
//只能是 A a; //或者是 A *a = new A(); //沒有 A a = new A(); //這個是Java中的語法,因此要區分C++和Java的語法和機制
若是用A* a = new A();聲明瞭對象
a.run(); //會報錯 a->run(); //這纔是正確的語法