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次?通過數組對象調用構造函數
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次?通過數組對象調用構造函數
線
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];
^
沒有,此行不會調用構造函數的。它只創建了30個元素,類型爲A
。陣列的每個元素是null
。
有沒有辦法做的正是你想做的事,但在這裏是非常接近,都調用默認的構造函數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++的「新」)時,它總是爲您創建並且現在有權訪問的每個對象調用默認構造函數。 (請注意,如果沒有默認的構造函數,那麼這兩個答案都不會編譯!)
如果我帶一個內部流(非靜態)讓我們說int b;那麼obj [0] .b = 1;說空指針異常,我很好理解。但是如何obob [0] .i = 3;作品? – Nil
它的工作原理是因爲'i'是靜態的,不需要'A'的任何實例來保存一個值。 – Reimeus