В чем разница между ключевыми словами struct и const в 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 — «замок», который защищает данные от изменений.

Ответ 18+ 🔞

А, ну вот опять народ путает, как будто в первый раз слышит! Смотри, давай на пальцах, а то голова кругом пойдёт.

Представь, что struct — это как чертёж для табуретки. Ты описываешь, из чего она состоит: четыре ножки, сидушка, может, ещё винт для надёжности. Это просто план, абстракция. А const — это суперклей, которым ты эту табуретку намертво к полу приклеиваешь. Сидеть можно, а сдвинуть — ни хуя себе, нельзя.

Короче, таблица, чтобы не ёрзать:

Чё за штука struct const
Суть Чертёж нового типа данных. Ты архитектор. Замок и цепь. Ты охранник в музее.
Где юзают Когда новый тип объявляешь. К переменным, методам, указателям цепляешь.
Что делает Создаёт каркас для данных и функций. Говорит: "Руками не трогать, изменению не подлежит".

Примеры, чтобы волнение ебать унялось:

Вот struct — делаем чертёж:

struct Point { // Родили новый тип, Point. Раньше его не было!
    int x;     // Координата. В struct по умолчанию всё публичное, не как в class.
    int y;
    void move(int dx, int dy) { // Метод, который точку двигает.
        x += dx;
        y += dy;
    }
};

Point p1{10, 20}; // А вот по чертежу собрали реальный объект. Табуретка готова.
p1.move(5, 5);    // И её можно пинать, то есть двигать. Всё работает.

А вот const — навешиваем замок:

const int MAX_SIZE = 1024; // Всё, приехали. MAX_SIZE теперь как скала. Изменить? Да похуй, не выйдет.

const Point origin{0, 0}; // Точка "ноль-ноль". Священная, неприкосновенная.
// origin.move(1,1); // Пробуем сдвинуть? Ошибка компиляции! Компилятор тебе: "Чё, бля, охренел? Она же const!"

// С указателями вообще пиздец начинается, там где const поставить:
Point p{1, 2};
const Point* ptr1 = &p; // Данные через этот указатель — только для чтения. Музейный экспонат.
// ptr1->x = 5; // Ошибка! Нельзя картину в музее подрисовать.
ptr1 = &origin; // А вот сам указатель — пожалуйста, поверни куда угодно.

Point* const ptr2 = &p; // А тут наоборот: указатель приколочен к адресу p.
ptr2->x = 5; // Но данные по этому адресу менять можно! Ломай — не хочу.
// ptr2 = &origin; // Ошибка! Сам указатель сдвинуть нельзя, он const.

const Point* const ptr3 = &p; // А это, бля, высшая форма паранойи. И данные нельзя трогать, И указатель вертеть. Полный обездвиж.

И отдельная песня — const в методах.

struct Rectangle {
    int width, height;
    int area() const { // Ключевое слово! Этот метод НЕ МЕНЯЕТ объект. Он только смотрит.
        return width * height;
    }
    void scale(int factor) { // А этот — меняет. Без const.
        width *= factor;
        height *= factor;
    }
};

const Rect r{3, 4}; // Константный прямоугольник. За стеклом.
int a = r.area();   // Окей, площадь посчитать можно. Он же const-метод, он не портит.
// r.scale(2);      // А вот это — НИ-НИ! Ты чё, пытаешься константный объект масштабировать? Иди ты нахуй с такими идеями.

Итог, ёпта: struct — это когда ты Леонардо да Винчи и рисуешь схему вертолёта. А const — это когда ты потом этот вертолёт в смоле вымажешь и в бетон замуруешь, чтобы никто винтик не открутил. Совершенно разные вещи, ядрёна вошь.