Ok У меня была эта проблема, и я не мог найти хороший ответ, так что я собираюсь поделиться тем, что узнал.
Вы можете пройти по значению, в этом нет ничего плохого. (как вы показали в своем вопросе.)
Но причина, по которой мы передаем параметр по ссылке const, заключается в том, что функция не делает фактическую копию вызываемого значения. Его ссылка на нее, поэтому ее просто указывая на это где бы он ни находился в памяти.
Это экономит время обработки, особенно если его что-то большое, имеющее тысячи имен ... В этом случае сохраненное время будет практически ничем.
И для константы, которая гарантирует пользователю функцию, что ссылочное значение не будет изменено, поскольку оно может быть изменено, так как у вас есть доступ к исходному местоположению в памяти, потому что он передан по ссылке .. Если ваше определение функции фактически изменяет значение параметра, вызываемого в const-ссылке, это будет ошибка компилятора, это не позволит вам это сделать. потому что когда вы ставите const, вы говорите компилятору, что это значение не может быть изменено.
Спасибо, Джеймс! Для оператора присваивания копий существует ли какой-либо тип класса, который не может быть скопирован? Я думаю, что у всех типов классов, по крайней мере, есть конструктор копии по умолчанию? – Tim
@Tim: Конечно: если у вас есть _private_ объявленный пользователем конструктор копирования для класса, то конструктор копирования будет недоступен (если вы не являетесь членом-членом или другом этого класса), и класс не будет конструктивным. Если вы объявляете конструктор копирования, но не определяете его, то класс вообще не копирует конструкцию (и попытка копирования-конструирования экземпляра приведет к ошибкам компоновщика). Оба эти метода используются (обычно вместе), чтобы класс не был доступен для копирования. –
Спасибо! Интересно, в каких случаях нужен класс, который нельзя копировать? – Tim