Если вместо этого operator+
было объявлено как принимающее его операнды по значению, например,
Matrix operator+(Matrix arg1, Matrix arg2)
тогда нужно будет сделать копии arg1
и arg2
для передачи в функцию. Простое добавление матрицы, например,
Matrix x, y;
x + y;
потребует создания копий x
и y
; фактически вам приходится копировать 32 double
с, что, хотя и не очень дорого в этом случае, также не особенно дешево. Когда вы берете аргумент по ссылке, копировать не нужно.
Обратите внимание, что некоторые перегрузки операторов должны принимать свои аргументы по ссылке. В качестве общего примера рассмотрим оператор вставки потока <<
: он должен взять операнд std::istream
по ссылке, поскольку невозможно скопировать поток.
Указатели нельзя использовать, поскольку операторы не могут быть перегружены для указателей: по крайней мере один операнд каждого оператора перегрузки должен быть классом или типом перечисления. Даже если бы вы могли использовать указатели, синтаксис был бы очень неудобным; вместо использования x + y
, как показано выше, вам нужно будет использовать &x + &y
.