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

240
23 апреля 2017, 01:03

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

MyString & operator =(MyString & tmp)

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

Answer 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);
Answer 2

& относится к типу возвращаемого результата. В данном случае означает, что возвращается ссылка на MyString. Оператор присвоения в С/С++ должен возвращать результат присвоения, который равен значению переменой слева от = после присвоения. Можно возвращать и копию результата, то есть без ссылки, но это может быть неэффективнее, если результат содержит много данных.

Важно отметить, что если возвращаешь ссылку, то эта ссылка должна быть на что-то, что будет продолжать жить после выхода из кода оператора. (Обычно, конечно, операторы присвоения возвращают ссылку на *this, то есть на сам объект от имени которого вызывается оператор - тот объект который слева от = ).

Кстати, некоторые рекомендуют возвращать константную ссылку:

const MyString& operator=(const MyString& tmp);

чтобы нельзя было писать такие вещи:

(a=b)=c;

Потому что после выполнения такого выражения, b будет не равно a и c, если изначально b было не равно c. Считается что это выглядит не интуитивно понятно. Но это необязательно. Например многие популярные библиотеки классов так не делают.

READ ALSO
2-3 дерева на С++ [требует правки]

2-3 дерева на С++ [требует правки]

Я осмотрел весь Google, ничего не нашёл то, что мне нужноПожалуйста, скинь мне готовый код 2-3 дерева

246
Как обновить store из Component?

Как обновить store из Component?

по задумке дизайнера форма должна обновляться при выборе значения из <select/>

296
Mongoose поля с unique дублируются

Mongoose поля с unique дублируются

Доброго дня, коллеги!

267