C++中建立物件的兩種方法及其區別

bzhxuexi發表於2013-11-28

在C++裡,有兩種方法建立物件:

方法一:(不用new)

ClassName object(param);

這樣就宣告瞭一個ClassName型別的object物件,C++會為它分配足夠的存放物件所有成員的儲存空間。

如:A    a;

這個是在棧上建立一個類物件 程式退出其作用域後自動呼叫類的解構函式.

注意:為節省儲存空間,C++建立物件時僅分配用於儲存資料成員的空間,而類中定義的成員函式則被分配到儲存空間中的一個公用區域,由該類的所有物件共享。

例如,我定義了一個這樣的類:

class Rec
{
   public:
   Rec(int width,int height);
   ~Rec();
   int getArea();

   private:
   int Rwidth;
   int Rheight;
};

當你Rec myRec(5,5);這樣建立一個myRec物件,然後列印出sizeof(myRec);的時候,會得到 8 這個結果。

因為myRec中有2個int型別的資料成員,一個int成員佔4個位元組,所以myRec物件佔8個位元組。

這種方法建立的物件,記憶體分配是分配到棧中的,由C++預設建立和撤銷,自動呼叫建構函式和解構函式

注意:該方法建立的物件呼叫類方法時,必須用“.”,而不能用“->”.如myRec.getArea();

=============================================================================================

方法二:(用new)

ClassName *object=new ClassName(param);//如:A   a  =  new    A();

delete object;

這個是在堆上建立一個類物件, 必須手動delete釋放物件 否則會造成記憶體洩露的.

       這種方法跟java有點類似,相同的是,它們都是在堆上分配記憶體來建立物件的(與方法一不同);不同的是,C++用new建立物件時返回的是一個物件指標,object指向一個ClassName的物件,C++分配給object的僅僅是存放指標值的空間。而且,用new 動態建立的物件必須用delete來撤銷該物件。只有delete物件才會呼叫其解構函式。

注意:new建立的物件不是用“*”或“.”來訪問該物件的成員函式的,而是用運算子“->”;

例如:Rec *rec=new Rec(3,4);

      rec->getArea();

      delete rec;

順便提一下:

一般來說,編譯器將記憶體分為三部分:靜態儲存區域、棧、堆。靜態儲存區主要儲存全域性變數和靜態變數,棧儲存呼叫函式相關的變數、地址等,堆儲存動態生成的變數。在c中是指由malloc,free運算產生釋放的儲存空間,在c++中就是指new和delete運算子作用的儲存區域。

-------------------------------------------------------------------------------------------------------------------------------------------------------------

下面是總結的一些關於new建立類物件特點:

  • new建立類物件需要指標接收,一處初始化,多處使用
  • new建立類物件使用完需delete銷燬
  • new建立物件直接使用堆空間,而區域性不用new定義類物件則使用棧空間
  • new物件指標用途廣泛,比如作為函式返回值、函式引數等
  • 頻繁呼叫場合並不適合new,就像new申請和釋放記憶體一樣

相關文章