Ответ 1
Единственная разумная вещь, которую вы можете сделать с C-массивом в С++ 03, это инициализировать значение-инициализацию (в С++ 11 и за ее пределами можно инициализировать список).
Из стандарта С++ 03, §8.5/7:
Объект, инициализатор которого представляет собой пустой набор скобок, т.е.(), должен инициализироваться значением.
И из § 8.5/5:
Для инициализации объекта с типом
T
означает:
- if
T
- это тип класса с объявленным пользователем конструктором, тогда вызывается конструктор по умолчанию дляT
(и инициализация плохо сформирована, еслиT
не имеет доступного конструктора по умолчанию);- if
T
- это неединичный тип класса без конструктора, объявленного пользователем, то каждый нестатический элемент данных и компонент базового классаT
инициализируется значением;- , если
T
- тип массива, тогда каждый элемент инициализируется значением;- , иначе объект инициализируется нулем
Для нулевой инициализации объекта типа
T
означает:
- , если
T
является скалярным типом, объект устанавливается в значение0
(ноль), преобразованное вT
;- если
T
- тип неединичного класса, каждый нестатический член данных и каждый подобъект базового класса инициализируются нулем;- Если
T
- это тип объединения, объекты, сначала названные элементом данных) инициализируются нулем;- if
T
- тип массива, каждый элемент инициализируется нулем;- Если
T
является ссылочным типом, инициализация не выполняется.
Итак, если ваше определение конструктора изменено на
A::A() : a(), ptr() { }
тогда вам гарантируется, что пост-построение, все 5 элементов A::a
будут иметь значение '\0'
и A::ptr
будет null.