Какая польза от перегрузки const в C++?


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

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

4   51   2008-10-30 21:04:24

4 ответа:

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

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

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

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