Ответ
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 — это когда ты потом этот вертолёт в смоле вымажешь и в бетон замуруешь, чтобы никто винтик не открутил. Совершенно разные вещи, ядрёна вошь.