почему иногда функция возвращает константную или константную ссылку - PullRequest
5 голосов
/ 20 мая 2011

Во-первых, зачем возвращать const? скажи, что у меня есть

friend const MyVec operator-(const MyVec& left, const MyVec& right)

поэтому возвращаемое const не позволяет мне:

mva - mvb = mvc;

Во-вторых, зачем возвращать константную ссылку? если есть:

friend const MyVec& operator++(MyVec& v)

с константой не могу: (++mva) = mvc

если это

MyVec& operator++(MyVec& v)

Я могу: ++(++mva) // с шагом в два раза.

я правильно понимаю?

Ответы [ 2 ]

7 голосов
/ 20 мая 2011

Нет веских причин для возврата объекта const.Однако есть много веских причин для возврата указателей или ссылок на const-объекты.

В программе может быть объект, который очень дорого копировать, поэтому он возвращает ссылку.Тем не менее, объект не должен быть изменен через эту ссылку.Например, он может быть частью отсортированной структуры данных, и если его значения были изменены, он больше не будет сортироваться правильно.Таким образом, const предотвращает его случайное изменение.

Арифметические операторные функции не должны возвращать константные объекты, в точности из-за проблем в вашем вопросе.

Разыменование итератора должно возвращать ссылку на констант.Это если он работает с коллекцией const-объектов или, возможно, с коллекцией const.Вот почему функции класса иногда имеют две копии функции со второй копией, использующей const для самой функции, например:

T& operator[](size_t index);
const T& operator[](size_t index) const;

Первая функция будет использоваться для неконстантных объектов, а втораяфункция будет использоваться для константных объектов.

3 голосов
/ 20 мая 2011

Да, ваше понимание верно. Чтобы избежать случайных присвоений , можно вернуть объект с помощью const или const reference.

С помощью operator - вы возвращаете объект по значению.Чтобы избежать его случайного редактирования, можно вернуть значение const, потому что в любом случае объект будет в основном временным.Вы можете вернуть его по ссылке const.

...