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.
  • Как передавать структуры в функции и использовать их в массивах.
  • Как писать чистый, понятный и безопасный код с помощью структур и перечислений.