2012-09-23 2 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] = новый A [30]; : - эта строка должна вызывать конструктор по умолчанию 30 раз?вызов конструктора через массив объектов

+0

Если я беру ineteger (не статический), скажем int b; то obj [0] .b = 1; говорит исключение null-указателя, прекрасно понимаю. Но howcome obj [0] .i = 3; работает ? – Nil

+0

Это работает, потому что 'i' является статическим и не нуждается в каком-либо экземпляре' A' для хранения значения. – Reimeus

ответ

11

Линия

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

не вызывает конструктор A. Он создает 30 необоснованных ссылок на A;

Чтобы создать экземпляр ссылки 30 объектов, вы можете использовать:

A obj[] = { new A(), new A(), ..28 more -> 
}; 

или лучше в этом случае, учитывая количество элементов:

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

Note, первое использование 30 в массиве объявление размера является незаконным.

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

в 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 необходимо использовать «delete []», а не просто «delete».)

Второй ответ создаст массив из 30 объектов A в стеке. Теперь компилятор поймет, что obj имеет 30 элементов, а sizeof (obj) будет таким же, как в вашем вопросе. Однако obj может использоваться только в этой функции (или функции, которую она вызывает), поскольку, как только функция вернется, она будет удалена из стека, вызвав 30 деструкторов в процессе. (Это только локальная переменная.)

С C++ (или любым хорошим объектно-ориентированным языком) создание объекта всегда означает как выделение пространства, так и вызов конструктора. В противном случае у вас действительно нет полезного объекта. Таким образом, когда объект создается любым поддерживаемым способом (локальная переменная или «новая» для C++), он всегда вызывает конструктор по умолчанию для каждого созданного вами объекта и теперь имеет доступ к нему. (Обратите внимание, что если бы не было конструктора по умолчанию, тогда ни один из ответов даже не компилировался бы!)

Смежные вопросы