0Pricing
C++ Academy · Урок

Константные функции-члены

Помечайте методы только для чтения

«Константные функции-члены» — бесплатный урок C++ Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

Что такое константная функция-член

Функция-член, помеченная как const, обещает не изменять наблюдаемое состояние объекта. Ключевое слово указывается после списка параметров.

#include <iostream>

class Counter {
    int n = 0;
public:
    int value() const { return n; }   // read-only
    void inc() { ++n; }
};

int main() {
    Counter c;
    c.inc();
    std::cout << c.value() << "\n";
}

Константные объекты вызывают только константные методы

Для объекта const можно вызывать только функции-члены const. Неконстантные методы запрещены.

#include <iostream>

class Counter {
    int n = 0;
public:
    int value() const { return n; }
    void inc() { ++n; }
};

int main() {
    const Counter c;
    std::cout << c.value() << "\n";   // OK
    // c.inc();                        // ERROR
}

Указатель this становится константным

Внутри константной функции-члена this является указателем на константный объект, поэтому компилятор отклоняет любую попытку изменить члены объекта.

Помечайте все методы только для чтения как константные

Функции доступа, запросы и функции вывода должны быть const. Благодаря этому они работают с константными объектами и константными ссылками.

Перегрузка по константности

Можно предоставить константную и неконстантную версии метода; компилятор выбирает нужную в зависимости от того, является ли объект константным.

#include <iostream>
#include <vector>

class Box {
    std::vector<int> v{1, 2, 3};
public:
    int& at(int i) { return v[i]; }              // mutable access
    const int& at(int i) const { return v[i]; }  // read-only access
};

int main() {
    Box b;
    b.at(0) = 99;
    std::cout << b.at(0) << "\n";
}

Ключевое слово изменяемости

Изменяемые члены можно менять даже внутри константного метода — это полезно для кэшей или счётчиков, не являющихся частью логического состояния.

#include <iostream>

class Cache {
    mutable int hits = 0;
    int data = 42;
public:
    int get() const { ++hits; return data; }   // hits is mutable
    int hitCount() const { return hits; }
};

int main() {
    Cache c;
    c.get(); c.get();
    std::cout << c.hitCount() << "\n";
}

Логическая и физическая константность

const защищает логическое состояние объекта, а mutable позволяет изменять детали реализации, например кэши, не нарушая это обещание.

Константные методы и константные ссылки

Функция, получающая const&, может вызывать для этого объекта только константные методы — это ещё одна причина помечать функции запросов как константные.

#include <iostream>

class Counter {
    int n = 5;
public:
    int value() const { return n; }
};

void report(const Counter& c) {
    std::cout << c.value() << "\n";   // needs value() to be const
}

int main() { Counter c; report(c); }

Возврат константных ссылок

Константные функции доступа часто возвращают const&, чтобы предоставить доступ к членам без возможности их изменить или скопировать.

Не удаляйте константность приведением типа

Использование const_cast для изменения действительно константного объекта приводит к неопределённому поведению. Для обоснованных исключений вместо этого используйте mutable.

Классы с корректной константностью

В хорошо спроектированном классе каждый метод, не изменяющий объект, помечен как const, поэтому класс без проблем работает в константном контексте всей программы.

Быстрая проверка

Проверьте, насколько хорошо Вы поняли константные функции-члены.

Итоги

Вы научились помечать методы только для чтения как const, узнали, что константные объекты вызывают только константные методы, разобрались с перегрузкой по константности и увидели, как mutable позволяет изменять детали реализации. Избегайте const_cast и с самого начала проектируйте классы с корректной константностью.

Часто задаваемые вопросы

Урок «Константные функции-члены» бесплатный?

Да — полный текст урока «Константные функции-члены» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «Константные функции-члены»?

Помечайте методы только для чтения Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Константные функции-члены»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Константные переменные и параметры
  2. Константные функции-члены
  3. constexpr и время компиляции
  4. consteval и constinit
← Назад к C++ Academy