Всем привет, я начинающий в 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
. Считается что это выглядит не интуитивно понятно. Но это необязательно. Например многие популярные библиотеки классов так не делают.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Я осмотрел весь Google, ничего не нашёл то, что мне нужноПожалуйста, скинь мне готовый код 2-3 дерева
по задумке дизайнера форма должна обновляться при выборе значения из <select/>