Структуры (struct)

Структура (struct) - это сложный тип данных, который позволяет объединить несколько переменных разных типов под одним именем. Это как "коробка" для хранения связанных данных.

Пример из реальной жизни:

  • Запись о студенте: имя (строка), возраст (число), средний балл (дробное число)

  • Координаты точки: x и y (два числа)

  • Параметры прямоугольника: ширина, высота, цвет

// Пример структуры для хранения информации о книге struct Book { std::string title; // Название книги std::string author; // Автор int year; // Год издания double price; // Цена };
Зачем это нужно?
  1. Группировка данных - связанная информация хранится вместе

  2. Упрощение кода - вместо отдельных переменных работаем с одним объектом

  3. Читаемость - код становится более понятным

  4. Переиспользование - один раз объявили, много раз используем


Синтаксис

Объявление структуры
struct Person { // Поля структуры (члены данных) std::string name; int age; bool isStudent; // Методы (можно добавлять как в классах) void printInfo() { std::cout << name << ", " << age << " лет. " << (isStudent ? "Студент" : "Не студент") << endl; } };
Способы инициализации:

Поэлементное присваивание (самый простой способ)

Person p1; p1.name = "Иван"; p1.age = 20; p1.isStudent = true;

Инициализация при создании (C++11)

Person p2 {"Мария", 22, false};

Конструкторы

struct Person { std::string name; int age; // Конструктор по умолчанию Person() : name("Неизвестно"), age(0) {} // Параметризованный конструктор Person(std::string n, int a) : name(n), age(a) {} }; Person p3; // Используется конструктор по умолчанию Person p4("Алексей", 30); // Параметризованный конструктор

Доступ к полям структуры

Доступ к полям осуществляется через оператор . для объектов и -> для указателей:

Person person {"Ольга", 25, true}; // Доступ через точку std::cout << person.name << endl; person.printInfo(); // Для указателей Person* ptr = &person; std::cout << ptr->name << endl; // Эквивалентно (*ptr).name ptr->printInfo();

Вложенные структуры

Структуры могут содержать другие структуры:

struct Address { std::string city; std::string street; int house; }; struct Employee { std::string name; Address workAddress; // Вложенная структура Address homeAddress; // Можно использовать несколько раз }; // Инициализация Employee emp { "Иван Петров", {"Москва", "Ленина", 10}, // workAddress {"Москва", "Пушкина", 5} // homeAddress };

Массивы структур

Структуры часто используют в массивах:

struct Student { std::string name; double gpa; }; Student group[3] = { {"Алиса", 4.5}, {"Боб", 3.7}, {"Чарли", 4.9} }; // Перебор массива for (int i = 0; i < 3; ++i) { std::cout << group[i].name << ": " << group[i].gpa << endl; }

Указатели на структуры

Работа с указателями на структуры:

Rectangle rect {10, 20}; Rectangle* ptr = ▭ // Доступ через указатель std::cout << "Width: " << ptr->width << endl; std::cout << "Height: " << (*ptr).height << endl; // Альтернативный синтаксис // Динамическое выделение памяти Rectangle* dynRect = new Rectangle{30, 40}; // ... delete dynRect; // Не забываем освободить память!

Современные возможности (C++17)

Structured bindings:

struct Point { double x, y; }; Point p {1.5, 2.5}; // Разложение структуры на отдельные переменные auto [xCoord, yCoord] = p; std::cout << xCoord << ", " << yCoord << endl;

Вывод типов конструкторов:

struct Item { int id; std::string name; }; // C++17 позволяет опускать тип структуры Item makeItem() { return {42, "Ответ"}; // Тип выводится автоматически }

Практический пример: система управления библиотекой

#include <iostream> #include <string> #include <vector> struct Date { int day, month, year; void print() const { std::cout << day << "." << month << "." << year; } }; struct Book { std::string title; std::string author; Date publicationDate; bool isAvailable; void printInfo() const { std::cout << title << " by " << author << ", published: "; publicationDate.print(); std::cout << ", Status: " << (isAvailable ? "Available" : "Borrowed") << std::endl; } }; struct Library { std::vector<Book> books; void addBook(const Book& book) { books.push_back(book); } void listAvailableBooks() const { for (const auto& book : books) { if (book.isAvailable) { book.printInfo(); } } } }; int main() { Library lib; // Добавляем книги lib.addBook({"Война и мир", "Лев Толстой", {1869, 1, 1}, true}); lib.addBook({"1984", "Джордж Оруэлл", {1949, 6, 8}, false}); lib.addBook({"Мастер и Маргарита", "Михаил Булгаков", {1967, 1, 1}, true}); // Выводим доступные книги std::cout << "Доступные книги:\n"; lib.listAvailableBooks(); return 0; }
Разбор примера:
  1. Созданы три структуры: Date, Book и Library

  2. Каждая структура содержит данные и методы для работы с ними

  3. Library использует вектор для хранения книг

  4. Реализованы методы для добавления и вывода книг

  5. Показана работа с вложенными структурами


Структуры в C++ - это мощный инструмент, который:

  • Позволяет организовывать данные в логические группы

  • Делает код более читаемым и поддерживаемым

  • Может содержать как данные, так и методы для работы с ними

  • Поддерживает все основные возможности ООП

  • Эффективно работает с современными возможностями C++

Правильное использование структур значительно улучшает качество кода и упрощает разработку сложных программ.


Комментарии

Добавить комментарий

Чтобы оставить комменатрий необходимо Авторизоваться