Обычно, если Объявить одно имя (только) на объявление , соблюдается правило,
тогда это позволяет последовательно написать указатель / ссылку «застрял» рядом с типом как:
istream& operator>> (istream& in, Complex& c)
{ //...
Таким образом, можно видеть, что функция с именем operator>>
возвращает тип istream&
(ссылка на объект istream).
Эта функция принимает 2 переменные:
in
типа istream&
(ссылка на объект istream),
c
типа Complex&
(ссылка на сложный объект).
и аналогично для:
ostream& operator<< (ostream& out, const Complex& c)
{ //...
Форматирование кода никоим образом не влияет на то, как код компилируется.
Таким образом, определения функций в этом ответе точно такие же, как в вопросе.
Что касается использования ссылки, я предлагаю прочитать: Когда использовать ссылки против указателей