Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
const: Гарантия неизменяемости
Ключевое слово const в C++ — это обещание компилятору, что данные не будут изменены. Оно позволяет:
- Защитить от случайных изменений
- Оптимизировать код
- Ясно выразить намерение программиста
Использование 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
}
Лучшие практики
- Используй const по умолчанию — сначала напиши const, потом убирай если нужно
- Const ссылки для параметров — экономит память и показывает намерение
- Const методы в классах — методы чтения должны быть const
- Const данные-члены — неизменяемые поля
const делает код **более безопасным и самодокументирующимся**.