Вопрос

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

При каких обстоятельствах вы можете воспользоваться этой функцией?

Это было полезно?

Решение

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top