Что такое использование перегрузки const в С++?

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

В каких обстоятельствах вы можете воспользоваться этой возможностью?

Ответ 1

Это действительно имеет смысл, когда функция-член возвращает указатель или ссылку на элемент данных вашего класса (или член члена, или член члена члена, и т.д.). Как правило, возвращающие неконстантные указатели или ссылки на элементы данных неодобрительно, но иногда это разумно или просто очень удобно (например, оператор []). В таких случаях вы предоставляете константу и неконстантные версии получателя. Таким образом, решение о том, может ли объект быть изменен, зависит от функции, использующей его, которая имеет выбор объявлять ее const или не const.

Ответ 2

Это так, чтобы вы могли заставить компилятор обеспечить, возвратите ли вы объект const или обычный, и все еще сохраняете одну и ту же подпись метода. Здесь подробно объясняется Const Correctness.

Ответ 3

Возможно, вы захотите использовать его, чтобы решить, следует ли возвращать ссылку на объект const или нет. Контейнеры STL используют функцию перегрузки begin() и end(), чтобы решить, следует ли возвращать const_iterator или обычный итератор.

Ответ 4

Посмотрите на поведение std:: map:: operator []. Версия const выдает ошибку, если вы пытаетесь ссылаться на недействительный ключ, но неконтентная версия делает вставку. Поведение ввода намного удобнее, чем использование std:: map:: insert (и, кроме того, сделает переписку), но не может работать для карты const.