Вернуть пустоту или ссылку на себя?

Учитывая следующий класс:

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}) является более кратким), это бессмысленно в большинстве других случаев (например, у вас, где мы могли бы просто добавить два ints вместо вызова метода дважды).

Другие вопросы по тегам