Там нет никакого способа сделать именно то, что вы хотите сделать, но вот две вещи, которые приходят очень близко, и вызывая конструктор по умолчанию в 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++), он всегда вызывает конструктор по умолчанию для каждого созданного вами объекта и теперь имеет доступ к нему. (Обратите внимание, что если бы не было конструктора по умолчанию, тогда ни один из ответов даже не компилировался бы!)
Если я беру ineteger (не статический), скажем int b; то obj [0] .b = 1; говорит исключение null-указателя, прекрасно понимаю. Но howcome obj [0] .i = 3; работает ? – Nil
Это работает, потому что 'i' является статическим и не нуждается в каком-либо экземпляре' A' для хранения значения. – Reimeus