C++中new A(),new A與new A[]的區別

 

在C++中經常需要用到new來進行動態內存的分配,但是在使用new的過程中對於新手容易產生混淆,特別是關於形如new A(),new A[],new A,三者的區別。實際上他們分別表示對一個對象分配內存並初始化,直接爲一個對象進行內存分配,對一個對象分配一組內存,但這只是一個簡單的概述,今天我們就來更詳細地瞭解這個問題。

1.new A

例如:int *p=new int;

是一個最簡單的new A的表達式,它表示的意思是分配一個int字節的內存空間,並將其地址傳給指針p。但是僅僅分配了一個int字節的內存,並未對內存中的內容進行初始化,其中的內容是未定義的。

例如:string *p=new string;

這是對指針p分配一個string對象的內存,雖然同樣未進行初始化,但是對於string類而言,還是會調用默認構造函數,初始化成爲一個空的string對象。

2.new A()

例如:int *p=new int();或int *p=new int(123);

形如上面兩個例子的new A(),同樣表示的是爲指針p分配一個int的內存,但後面的()表示的意思是用()中的內容對指針*p中的內容進行初始化。對於int *p=new int();而言你,缺省難過了初始化的內容則默認初始化爲0,此時*p=0;對於int *p=new int(123);使用123初始化該內存區域,此時*p=123;對於string類也是同樣的效果,甚至對於有時初始化成員比較多的時候還會採用”{}”運算符代替()進行初始化。

3.new A[]

例如:int *p=new int[n];

這是對指針p分配一個長度爲n的int型數組的意思,指針p指向數組首元素的地址。但是雖然這裏所謂的數組實際上並不是一個真正意義上的數組,而是更像單純的一塊連續的內存。因爲我們不能夠通過下標去隨機訪問這片內存中的內容,只能夠通過指針自增的方式對整片內存分配的區域進行訪問。所以不要奢望能夠通過new A[n][m]來分配一個二維數組,這種表達式是非法的,因爲實際上new只能夠返回一片內存的首地址。另外對於n的取值不同於數組,它的取值可以是一個變量,在運行時在進行賦值也可以。同時n還可以是0,即int *p=new int[0];這樣定義是合法的,但此時p爲一個空指針。

總之,這裏簡要的敘述了關於new的一些區別和一些小tips,主要爲自己的學習加深印象,需要更詳細的瞭解new請參考<<C++primer>>上的內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章