Всем привет, я начинающий в C++, возник вопрос касательно смысла ссылок в методе функции. Есть класс MyString, в нём два private поля: st - char массив и size - длина массива. Вот я делаю перегрузку оператора =
MyString & operator =(MyString & tmp)
Зачем ставится ссылка в аргументе я знаю, это указание системе, что нужно не копировать объект, а взять его адрес. Но что значит & перед operator? В каких случаях нужно использовать?
Ссылками могут быть не только параметры, но и возвращаемые значения.
Во-первых, такое определение перегруженного оператора присваивания согласуется с требованием для встроенных операторов присваивания согласно стандарту C++ (5.18 Assignment and compound assignment operators)
1 The assignment operator (=) and the compound assignment operators all group right-to-left. All require a modifiable lvalue as their left operand and return an lvalue referring to the left operand...
Во-вторых, Это позволяет избежать копирования исходного объекта в качестве возвращаемого значения, для которого было выполнено присвоение. То есть оператор возвращает ссылку на свой левый операнд (MyString &).
В-третьих, это позволяет записывать такие конструкции как, например,
MyString a, b, c;
(a = b ) += c;
Имейте в виду, что объявленный таким образом оператор присваивания
MyString & operator =(MyString & tmp);
не сможет иметь дело с константными или временными объектами в качестве правого операнда, так как параметр оператора объявлен как не константная ссылка, которую нельзя привязывать к временным объектам.
Более универсальный подход - это объявить оператор как
MyString & operator =(const MyString & tmp);
& относится к типу возвращаемого результата. В данном случае означает, что возвращается ссылка на MyString. Оператор присвоения в С/С++ должен возвращать результат присвоения, который равен значению переменой слева от = после присвоения. Можно возвращать и копию результата, то есть без ссылки, но это может быть неэффективнее, если результат содержит много данных.
Важно отметить, что если возвращаешь ссылку, то эта ссылка должна быть на что-то, что будет продолжать жить после выхода из кода оператора. (Обычно, конечно, операторы присвоения возвращают ссылку на *this, то есть на сам объект от имени которого вызывается оператор - тот объект который слева от = ).
Кстати, некоторые рекомендуют возвращать константную ссылку:
const MyString& operator=(const MyString& tmp);
чтобы нельзя было писать такие вещи:
(a=b)=c;
Потому что после выполнения такого выражения, b будет не равно a и c, если изначально b было не равно c. Считается что это выглядит не интуитивно понятно. Но это необязательно. Например многие популярные библиотеки классов так не делают.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости