← Назад к вопросам

Что такое ключевое слово const?

1.3 Junior🔥 221 комментариев
#Язык C++

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

const: Гарантия неизменяемости

Ключевое слово const в C++ — это обещание компилятору, что данные не будут изменены. Оно позволяет:

  1. Защитить от случайных изменений
  2. Оптимизировать код
  3. Ясно выразить намерение программиста

Использование const

1. Const переменные

Обычная переменная не может быть изменена после инициализации:

const int MAX_USERS = 100;
MAX_USERS = 200;  // Ошибка компиляции!

const std::string name = "Alice";
name = "Bob";  // Ошибка!

2. Const указатели

Здесь нужно быть внимательным — есть два варианта:

// const int *ptr — данные const, указатель может менять адрес
const int *ptr1;
int value = 10;
ptr1 = &value;  // Можно
*ptr1 = 20;     // Нельзя! Данные const

// int * const ptr — указатель const, но данные могут меняться
int value = 10;
int * const ptr2 = &value;
*ptr2 = 20;     // Можно
int other = 5;
ptr2 = &other;  // Нельзя! Указатель const

// const int * const — оба const
const int * const ptr3 = &value;  // Никакие изменения невозможны

3. Const методы класса

Метод не может изменять члены объекта:

class User {
private:
    std::string name;
    int age;

public:
    void setAge(int newAge) {
        age = newAge;  // Можно — не const метод
    }

    std::string getName() const {
        return name;  // Можно
        age = 0;      // Нельзя! Const метод
    }
};

4. Const параметры функций

Функция не будет менять переданные параметры:

// Const значение (копия)
void processValue(const int value) {
    value++;  // Нельзя
}

// Const ссылка (экономит память)
void printUser(const User& user) {
    std::cout << user.getName();  // Можно
    user.setAge(30);  // Нельзя! User const
}

// Const указатель
void readData(const void* ptr) {
    *(int*)ptr = 100;  // Нельзя
}

5. Const и ссылки

Очень полезно для оптимизации без копирования:

// Без const — копирование
void process(std::vector<int> vec) {
    // Копируется весь вектор!
}

// С const — ссылка, без копирования
void process(const std::vector<int>& vec) {
    // Нет копирования, но можем читать
    vec[0];  // Можно
    vec[0] = 10;  // Нельзя
}

Практические примеры

Пример 1: Const в структурах

struct Config {
    const int MAX_CONNECTIONS = 1000;
    const std::string DEFAULT_HOST = "localhost";
};

Пример 2: Const цепочка

class Database {
public:
    // Может вызвать const методы
    const std::vector<User>& getUsers() const {
        return users;  // Возвращаем const ссылку
    }

private:
    std::vector<User> users;
};

int main() {
    const Database db;  // db const
    db.getUsers();      // Можно вызвать const метод
    db.addUser(user);   // Нельзя! addUser не const
}

Проверка constness

Компилятор строго следит за const:

int main() {
    int x = 10;
    const int* ptr = &x;
    
    int* ptr2 = ptr;  // Ошибка! Отбрасываем const
    const int* ptr3 = ptr2;  // OK! Добавляем const
}

Лучшие практики

  1. Используй const по умолчанию — сначала напиши const, потом убирай если нужно
  2. Const ссылки для параметров — экономит память и показывает намерение
  3. Const методы в классах — методы чтения должны быть const
  4. Const данные-члены — неизменяемые поля
const делает код **более безопасным и самодокументирующимся**.