Ответ
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 — «замок», который защищает данные от изменений.