Структура (struct) - это сложный тип данных, который позволяет объединить несколько переменных разных типов под одним именем. Это как "коробка" для хранения связанных данных.
Пример из реальной жизни:
Запись о студенте: имя (строка), возраст (число), средний балл (дробное число)
Координаты точки: x и y (два числа)
Параметры прямоугольника: ширина, высота, цвет
// Пример структуры для хранения информации о книге
struct Book {
std::string title; // Название книги
std::string author; // Автор
int year; // Год издания
double price; // Цена
};
Зачем это нужно?
Группировка данных - связанная информация хранится вместе
Упрощение кода - вместо отдельных переменных работаем с одним объектом
Читаемость - код становится более понятным
Переиспользование - один раз объявили, много раз используем
Синтаксис
Объявление структуры
struct Person {
// Поля структуры (члены данных)
std::string name;
int age;
bool isStudent;
// Методы (можно добавлять как в классах)
void printInfo() {
std::cout << name << ", " << age << " лет. "
<< (isStudent ? "Студент" : "Не студент") << endl;
}
};
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
};
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;
}
Разбор примера:
Созданы три структуры: Date, Book и Library
Каждая структура содержит данные и методы для работы с ними
Library использует вектор для хранения книг
Реализованы методы для добавления и вывода книг
Показана работа с вложенными структурами
Структуры в C++ - это мощный инструмент, который:
Позволяет организовывать данные в логические группы
Делает код более читаемым и поддерживаемым
Может содержать как данные, так и методы для работы с ними
Поддерживает все основные возможности ООП
Эффективно работает с современными возможностями C++
Правильное использование структур значительно улучшает качество кода и упрощает разработку сложных программ.