2008-10-30 2 views
51

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

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

ответ

24

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

23

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

4

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

4

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

 Смежные вопросы

  • Нет связанных вопросов^_^