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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
64
0
21 808
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

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

Ответ принят как подходящий

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

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

#include <iostream>
using namespace std;
class base
{

public:
void fun() const
{
    cout<<"have fun";
}
void fun()
{
    cout<<"non const";
}

};
int main()
{
    base b1;
    b1.fun(); //does not give error
    return 0;
}

Здесь компилятор не выдаст ошибки, потому что в случае использования функций const компилятор преобразует указатель this в const this*. этот третий аргумент разделяет эти две функции.

Вы не объяснили, зачем вообще нужен квалификатор const для функций-членов.

Tanveer Badar 24.11.2019 13:08

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