Массивы объектов всегда будут использовать конструктор по умолчанию (без аргументов). Обойти это невозможно.
Существуют «специальные» конструкторы: конструктор копирования и оператор = ().
У вас может быть много конструкторов! Или попозже со множеством конструкторов. Время от времени Билл из Л-ла-Лэнд хочет нового конструктора с плавающей запятой, а не с двойными, чтобы спасти эти 4 паршивых байта. (Купите немного оперативной памяти Билл!)
Вы не можете вызвать конструктор, как обычный метод для повторного вызова этой логики инициализации.
Нельзя сделать виртуальную логику конструктора и изменить ее в подклассе. (Хотя, если вы вызываете метод initialize () из конструктора, а не вручную, виртуальные методы не будут работать.)
.
Все эти вещи создают много горя, когда в конструкторе существует значительная логика. (Или хотя бы дублирование кода.)
Поэтому я, как дизайнер, предпочитаю иметь минимальные конструкторы, которые (необязательно, в зависимости от их параметров и ситуации) вызывают метод initialize ().
В зависимости от обстоятельств initialize () может быть закрытым. Или он может быть общедоступным и поддерживать несколько вызовов (например, повторная инициализация).
.
В конечном счете, выбор здесь зависит от ситуации. Мы должны быть гибкими и учитывать компромиссы. Не существует универсального подхода.
Подход, который мы использовали бы для реализации класса с одним отдельным экземпляром, использующим потоки для связи с частью выделенного оборудования и который должен быть записан за 1/2 часа, не обязательно является тем, что мы использовали бы для реализации класса, представляющего математику для чисел с плавающей точкой переменной точности, написанных за много месяцев.