C++中建立物件的兩種方法及其區別
在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申請和釋放記憶體一樣
相關文章
- 建立連結串列兩種方法的區別
- C++中有三種建立物件的方法C++物件
- C++中建立持久物件的方法C++物件
- hibernate中建立session的兩種方式方式,區別在哪裡?Session
- 建立Session物件的兩種方式Session物件
- 最全--Java中建立物件的5種方法Java物件
- 將NSTimer新增至RunLoop中的兩種方法區別OOP
- C++中建立物件間訊息連線的一種系統方法 (轉)C++物件
- 【C++】C++用new和不用new建立類物件區別C++物件
- JavaScript建立物件的多種方法JavaScript物件
- c++物件建立帶括號與無括號的區別C++物件
- GET和POST兩種基本請求方法的區別
- 在儲存過程中建立表的兩種方法儲存過程
- 兩種動態建立表格的方法
- JavaScript建立閉包的兩種方式的優劣與區別分析JavaScript
- 物件建立模式和類建立模式的區別物件模式
- JS中建立物件的方法JS物件
- C++ 中四種強制型別轉換的區別C++型別
- Javascript中兩種方式定義函式的區別JavaScript函式
- C# 獲取程式路徑的幾種方法及其區別【WPF】C#
- 兩種增量備份的區別!
- MySQL建立資料庫的兩種方法MySql資料庫
- python之建立類的兩種方法Python
- 建立安裝程式的兩種方法 (轉)
- Java中物件的動態建立及其反射機制Java物件反射
- Java中建立物件的5種方式Java物件
- js中建立物件的幾種方式JS物件
- 求陣列長度的兩種方法,以及區別(strlen sizeof)陣列
- js建立物件及其使用JS物件
- JavaScript中判斷物件是否屬於Array型別的4種方法及其背後的原理與侷限性JavaScript物件型別
- MySql三種常見引擎及其區別MySql
- hash和history兩種模式的區別模式
- java創造匿名物件的兩種方法Java物件
- 遍歷物件鍵值對的兩種方法物件
- Java 建立 PDF 檔案包的兩種方法Java
- laravel建立新model資料的兩種方法Laravel
- PostgreSQL建立自增主鍵的兩種方法SQL
- rails中兩種回滾-reversible和revert區別AI