Стоит ли передавать по ссылке объект, используя при этом конcтантный метод?

Рейтинг: 2Ответов: 2Опубликовано: 28.04.2015

Часто в книгах встречал конструкцию вида:

void add_foo(const Foo&) const;

В книге объясняют тем, что лучше использовать константные методы, чтобы сразу было видно, где что меняется, а где нет.

Стоит ли передавать по ссылке объект, используя при этом конcтантный метод? Или следует лучше просто передавать без ссылки и без const? Кроме как нежелание копировать большой объект в память не могу придумать причин использовать так "извращенно" передачу по ссылке. По сути мы берем инструмент для передачи с возможностью изменения исходного объекта и запрещаем это делать. Стоит ли так делать постоянно? Может есть какие-то более важные причины о которых я просто не знаю?

Ответы

▲ 1

Да, вы правы.

Передача по константной ссылке практически (при правильном программировании) ничем не отличается от передачи копии. Причина обычно состоит лишь в оптимизации ненужного копирования.


Окей, существует случай, когда и правда есть разница. Например, если вы хотите сохранить ссылку на объект и следить за ним, вызывая методы-геттеры. При этом если объект передан по const-ссылке, вы будете реально видеть изменения переданного объекта. Если же вам передана копия, вы будете видеть лишь изменения копии. Как мы знаем, const означает лишь read-only view на объект, но не означает, что объект сам не может поменяться.


Тем не менее, в большинстве случаев имеется в виду одно и то же, и передача делается по const-ссылке лишь для оптимизации.


А const («для того, чтобы случайно не поменять») можно использовать и при передаче по значению, да.

▲ 1

По-моему, вы путаете константные методы класса и константные ссылки-параметры. Константный метод не изменяет состояние экземпляра своего класса, а не переданных параметров.