Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Смысл ссылок в методах функций C++

#cpp #ссылки #перегрузка_операторов #оператор_присваивания


Всем привет, я начинающий в C++, возник вопрос касательно смысла ссылок в методе функции.
Есть класс MyString, в нём два private поля: st - char массив и size - длина массива.
Вот я делаю перегрузку оператора =

MyString & operator =(MyString & tmp)


Зачем ставится ссылка в аргументе я знаю, это указание системе, что нужно не копировать
объект, а взять его адрес. Но что значит & перед operator? В каких случаях нужно использовать?
    


Ответы

Ответ 1



Ссылками могут быть не только параметры, но и возвращаемые значения. Во-первых, такое определение перегруженного оператора присваивания согласуется с требованием для встроенных операторов присваивания согласно стандарту 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);

Ответ 2



& относится к типу возвращаемого результата. В данном случае означает, что возвращается ссылка на MyString. Оператор присвоения в С/С++ должен возвращать результат присвоения, который равен значению переменой слева от = после присвоения. Можно возвращать и копию результата, то есть без ссылки, но это может быть неэффективнее, если результат содержит много данных. Важно отметить, что если возвращаешь ссылку, то эта ссылка должна быть на что-то, что будет продолжать жить после выхода из кода оператора. (Обычно, конечно, операторы присвоения возвращают ссылку на *this, то есть на сам объект от имени которого вызывается оператор - тот объект который слева от = ). Кстати, некоторые рекомендуют возвращать константную ссылку: const MyString& operator=(const MyString& tmp); чтобы нельзя было писать такие вещи: (a=b)=c; Потому что после выполнения такого выражения, b будет не равно a и c, если изначально b было не равно c. Считается что это выглядит не интуитивно понятно. Но это необязательно. Например многие популярные библиотеки классов так не делают.

Комментариев нет:

Отправить комментарий