Вернуть пустоту или ссылку на себя?
Учитывая следующий класс:
struct Object {
int x, y;
void addtoall( int value ){ x += value; y += value; };
Object& addtoall( int value ){ x += value; y += value; return *this; };
};
В чем разница между двумя функциями-членами?
Я понимаю, что возвращение ссылки на себя требуется для некоторых перегрузок операторов (например, operator+=), но необходимо ли исключать перегрузку операторов? Если нет, то когда вы захотите или должны вернуть ссылку на себя, а не возвращать пустоту?
Я извиняюсь, если это можно было найти через google-fu, или это очень простой вопрос, но я не был уверен, что именно искать (а не из-за отсутствия попыток).
2 ответа
В чем разница между двумя функциями-членами?
Функция, возвращающая ссылку на экземпляр, может быть прикована цепью
Object o;
o.addtoall(5).addtoall(6).addtoall(7);
Если это полезно, зависит от конкретного случая использования, но часто используется для разработки так называемого предметно-ориентированного синтаксиса языка.
Я понимаю, что возвращение ссылки на себя требуется для некоторых перегрузок операторов (например: operator+=)
Нет, это не так. Многие люди (включая меня) защищают, что такие операторы должны быть объявлены, чтобы вернуться void
наиболее заметно operator=
чья цепочка (или повторное использование выражений) фактически скрывает код в подавляющем большинстве случаев, когда он используется. Мы делаем это только для (неудачного) соглашения.
Что цепочки? Именно то, что возврат таких ссылок предназначен, чтобы:
std::string{"asdf"}.append(c1).append(c2)
append
возвращаетсяstring&
неудивительно. Хотя слегка полезно для string
(append({c1, c2})
является более кратким), это бессмысленно в большинстве других случаев (например, у вас, где мы могли бы просто добавить два int
s вместо вызова метода дважды).