Вы, конечно, можете предоставить все значения в списке инициализатора, например
Complex ac[] = { Complex(0, 2.0), Complex(1, 2.0), /* and so on */ };
но это становится очень громоздким очень быстро по мере увеличения размера. Поэтому естественно использовать цикл.
Хотя не представляется возможным независимо инициализировать элементы в автоматическом (который обычно эквивалентен «в стеке») буфере, это совсем не просто.
Проблема в том, что определение массива вызывает немедленный вызов конструктора. Вы должны будете определить массив char
(у которого нет конструктора), а затем создать и уничтожить элементы вручную (используя новые и явные вызовы деструктора). Это не так сложно, если только вам не нужна безопасность исключений, и в этом случае угловые случаи очень сложны в обращении.
Если вам разрешено конструировать по умолчанию, а затем переназначать элементы, это легко, и это покрыто другими ответами. Если у Complex
есть рабочий оператор присваивания, вы должны сделать это.