В чем разница между ключевыми словами struct и const в C++?

«В чем разница между ключевыми словами struct и const в C++?» — вопрос из категории C++ Core, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

struct и const — это фундаментально разные языковые конструкции в C++.

Критерий struct const
Назначение Определяет новый тип данных (пользовательский агрегатный тип или класс). Квалификатор типа, накладывающий ограничение неизменяемости.
Контекст использования Используется при объявлении типа. Применяется к переменным, методам, указателям и ссылкам.
Влияние Создает структуру для хранения данных и поведения (методов). Гарантирует, что объект не будет изменен после инициализации.

Примеры:

struct — создание типа:

struct Point { // Объявляем новый тип 'Point'
    int x;     // Поле (по умолчанию public в struct)
    int y;
    void move(int dx, int dy) { // Метод
        x += dx;
        y += dy;
    }
};

Point p1{10, 20}; // Создаем объект типа Point
p1.move(5, 5);    // Изменяем его состояние

const — наложение ограничения:

const int MAX_SIZE = 1024; // Значение MAX_SIZE нельзя изменить

const Point origin{0, 0}; // Объект origin неизменяем
// origin.move(1,1); // Ошибка компиляции: вызов неконстантного метода

// const применяется к указателям по-разному:
Point p{1, 2};
const Point* ptr1 = &p; // Данные по указателю неизменяемы
// ptr1->x = 5; // Ошибка
ptr1 = &origin; // OK, сам указатель менять можно

Point* const ptr2 = &p; // Сам указатель неизменяем
ptr2->x = 5; // OK, данные менять можно
// ptr2 = &origin; // Ошибка

const Point* const ptr3 = &p; // И данные, и указатель неизменяемы

const в сигнатурах методов:

struct Rectangle {
    int width, height;
    int area() const { // Константный метод: не изменяет состояние объекта
        return width * height;
    }
    void scale(int factor) { // Неконстантный метод
        width *= factor;
        height *= factor;
    }
};

const Rect r{3, 4};
int a = r.area();   // OK, вызов константного метода
// r.scale(2);      // Ошибка, вызов неконстантного метода на const-объекте

Итог: struct — это «кирпичик» для построения типов, а const — «замок», который защищает данные от изменений.