2012-09-23 57 views
1
class A 
{ 
    static int i; 
    A() 
    { 
    System.out.println(++i); 
    } 
    public static void main(String h[]) 
    { 
    A obj[] = new A[30]; 
    } 
} 

A obj [30] = new A [30]; : - 這一行應該調用默認的 構造函數30次?通過數組對象調用構造函數

+0

如果我帶一個內部流(非靜態)讓我們說int b;那麼obj [0] .b = 1;說空指針異常,我很好理解。但是如何obob [0] .i = 3;作品? – Nil

+0

它的工作原理是因爲'i'是靜態的,不需要'A'的任何實例來保存一個值。 – Reimeus

回答

11

A obj[30] = new A[30]; 

不會調用構造函數A。它創建了30個未被引用的參考文獻A;

實例化30個對象引用,可以使用:

for (int i=0; i < obj.length; i++) { 
    obj[i] = new A(); 
} 

注意,陣列中的第一次使用的30

A obj[] = { new A(), new A(), ..28 more -> 
}; 
在這種情況下給定的元件的數量

或更好大小聲明是非法的。

A obj[30] = new A[30]; 
    ^
+0

in C++ A obj [30];會有效嗎? – Nil

+0

自從我使用C++以來已經有一段時間了,但我不相信它會構建30個'A'實例...? –

+0

A obj [30] =新A [30]; ...對於錯字感到抱歉。並且我想要一個不帶循環或遞歸的實現,所以感謝第一種方法 – Nil

2

沒有,此行不會調用構造函數的。它只創建了30個元素,類型爲A。陣列的每個元素是null

0

有沒有辦法做的正是你想做的事,但在這裏是非常接近,都調用默認的構造函數30次兩件事情:

A *obj = new A[30]; 

A obj[30]; 

第一個答案將在堆上創建一個30個A對象的數組,爲每個對象調用默認構造函數。 obj可以傳回給這個函數的調用者,因爲它不在棧上。問題是,obj不再具有A [30]類型,所以sizeof(obj)將與原始問題中的代碼不同。 (請注意,刪除[]必須用於obj,而不僅僅是「刪除」。)

第二個答案將在棧上創建一個30個A對象的數組。現在編譯器會理解obj有30個元素,sizeof(obj)將與你的問題相同。然而,obj只能用在這個函數中(或者它調用的函數),因爲一旦函數返回,它就會從堆棧中消除,在進程中調用30個析構函數。 (它只是一個局部變量。)使用C++(或任何良好的面向對象的語言),創建一個對象始終意味着既分配空間又調用構造函數。否則,你真的沒有一個有用的對象。因此,當以任何受支持的方式創建對象(本地變量或C++的「新」)時,它總是爲您創建並且現在有權訪問的每個對象調用默認構造函數。 (請注意,如果沒有默認的構造函數,那麼這兩個答案都不會編譯!)

相關問題