09. Структуры и перечисления
Что такое структура
Структура (struct) — это способ объединить несколько связанных данных под одним именем. Это как папка, в которой лежат разные файлы, относящиеся к одному объекту.Например, если вы хотите хранить данные о студенте — имя, возраст и средний балл — можно использовать структуру вместо трёх отдельных переменных.
Пример структуры
#include <iostream>
#include <string>
using namespace std;struct Student {
string name;
int age;
double grade;
};
int main() {
Student s1; // создаём переменную структуры
s1.name = "Анна";
s1.age = 20;
s1.grade = 4.8;
cout << "Имя: " << s1.name << endl;
cout << "Возраст: " << s1.age << endl;
cout << "Средний балл: " << s1.grade << endl;
return 0;
}
Результат
Имя: Анна Возраст: 20 Средний балл: 4.8
Создание нескольких объектов структуры
Можно создать сразу несколько студентов:
Student s1 = {"Иван", 22, 4.2};
Student s2 = {"Мария", 19, 4.9};cout << s1.name << " и " << s2.name << endl;
Массив структур
Часто нужно хранить список объектов — например, целый класс студентов.
Student group[3] = {
{"Алиса", 20, 4.7},
{"Боб", 21, 3.9},
{"Кирилл", 22, 4.5}
};for (int i = 0; i < 3; i++) {
cout << group[i].name << " — балл: " << group[i].grade << endl;
}
Передача структуры в функцию
void printStudent(Student s) {
cout << s.name << ", возраст " << s.age << ", средний балл: " << s.grade << endl;
}int main() {
Student s = {"Олег", 23, 4.1};
printStudent(s);
return 0;
}
Передача по ссылке
Чтобы не копировать всю структуру, можно передать её по ссылке.
void updateGrade(Student &s, double newGrade) {
s.grade = newGrade;
}
Вложенные структуры
Можно использовать одну структуру внутри другой.
struct Address {
string city;
string street;
int house;
};struct Person {
string name;
int age;
Address addr;
};
int main() {
Person p;
p.name = "Сергей";
p.age = 30;
p.addr.city = "Нукус";
p.addr.street = "Амударья";
p.addr.house = 12;
cout << p.name << " живёт в городе " << p.addr.city << endl;
return 0;
}
Что такое перечисление (enum)
Перечисление — это набор именованных констант, которые помогают коду быть понятнее.Вместо непонятных чисел, например 0, 1, 2 — можно использовать понятные слова: ПОНЕДЕЛЬНИК, ВТОРНИК и т. д.
Пример enum
#include <iostream>
using namespace std;enum Day {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
};
int main() {
Day today = Wednesday;
if (today == Wednesday) {
cout << "Сегодня среда!" << endl;
}
return 0;
}
Объяснение
- enum Day — создаёт перечисление с днями недели.
- Каждому элементу автоматически присваивается число: Monday=0, Tuesday=1 и т.д.
- Можно использовать имена вместо чисел для удобства.
Задание значений вручную
enum Level {
Low = 1,
Medium = 5,
High = 10
};
Теперь можно использовать эти значения, например, для приоритета задач:
Level priority = High;
cout << "Приоритет: " << priority << endl;
enum class — современный вариант
Современный C++ предлагает более безопасный вариант — enum class. Он не позволяет случайно сравнивать значения разных перечислений.
enum class Color { Red, Green, Blue };enum class Fruit { Apple, Banana, Orange };
int main() {
Color c = Color::Green;
Fruit f = Fruit::Apple;
// cout << c == f; // Ошибка! Разные типы — безопасно.
if (c == Color::Green) {
cout << "Зелёный цвет!" << endl;
}
return 0;
}
Совместное использование структур и enum
Часто удобно хранить состояние объекта через перечисления внутри структуры.
enum class Status { Active, Inactive };struct User {
string name;
Status status;
};
int main() {
User u1 = {"Анна", Status::Active};
if (u1.status == Status::Active) {
cout << u1.name << " сейчас активна." << endl;
}
return 0;
}
Мини-практика
Попробуйте сделать сами:- Создайте структуру Car с полями: марка, год выпуска, скорость.
- Добавьте функцию, которая принимает машину и выводит её данные.
- Создайте enum class Gear {Park, Drive, Reverse, Neutral} и используйте его в структуре.
Пример решения
#include <iostream>
#include <string>
using namespace std;enum class Gear {Park, Drive, Reverse, Neutral};
struct Car {
string brand;
int year;
int speed;
Gear gear;
};
void showCar(Car c) {
cout << "Марка: " << c.brand << endl;
cout << "Год: " << c.year << endl;
cout << "Скорость: " << c.speed << " км/ч" << endl;
}
int main() {
Car myCar = {"Toyota", 2020, 120, Gear::Drive};
showCar(myCar);
return 0;
}
Типичные ошибки новичков
- Забыли указать тип enum class при сравнении (например, просто Drive вместо Gear::Drive).
- Используют struct без включения <string>, если есть строки.
- Путают присвоение структуры (Student s1 = s2) с копированием по ссылке — на самом деле это копия.
Советы новичкам
- Используйте структуры, если нужно объединить несколько разных типов данных в один объект.
- Enum помогает сделать код читаемым — не используйте числа для состояний.
- Если проект современный — всегда применяйте enum class вместо обычного enum.
- Структуры можно использовать как основу для классов, когда начнёте изучать ООП.
Итоги урока
Теперь вы знаете:- Как создавать структуры и объединять данные.
- Как работать с enum и enum class.
- Как передавать структуры в функции и использовать их в массивах.
- Как писать чистый, понятный и безопасный код с помощью структур и перечислений.