Распределение памяти при передаче аргументов функции - часть 3
Complex& Complex::Add(const Complex& x) { real += x.real; imaginary += x.imaginary; return *this; // передать ссылку на текущий объект }
Как и в случае с аргументом, передача ссылки на текущий объект позволяет использовать метод Add слева от операции присваивания, например в следующем выражении:
x.Add(y) = z;
К значению объекта x прибавляется значение y, а затем результату присваивается значение z (фактически это эквивалентно x = z). Чтобы запретить подобные конструкции, достаточно добавить описатель const перед типом возвращаемого значения:
const Complex& Complex::Add(const Complex& x) . . .
Передача аргументов и результата по ссылке аналогична передаче указателя в качестве аргумента:
Complex* Complex::Add(Complex* x) { real += x->real; imaginary += x->imaginary; return this; }
Если нет особых оснований использовать в качестве аргумента или результата именно указатель, передача по ссылке предпочтительней. Во-первых, проще запись операций, а во-вторых, обращения по ссылке легче контролировать.