Структуры (struct) в C++: объяснение с практическим примером
Что такое struct в C++?
STRUCT — это структура данных в C++, позволяющая хранить вместе элементы разных типов. В C++ структура — пользовательский тип данных. Она создаёт тип для группировки элементов различных типов под единым именем.
Например:
Предположим, нужно хранить информацию о человеке: имя, гражданство, возраст. Можно создать отдельные переменные name, citizenship, age.
Но если потребуется хранить данные о множестве людей, переменных станет много: name1, citizenship1, age1 и т.д. Чтобы избежать этого, лучше создать структуру.
В этом уроке вы узнаете:
- Что такое struct в C++
- Когда использовать структуру
- Инициализация структуры
- Создание экземпляров структуры
- Доступ к членам структуры
- Указатели на структуру
- Структура как аргумент функции
- Ограничения структуры C++
Когда использовать структуру?
Причины использования структуры в C++:
- Когда нужно хранить элементы разных типов под одним типом данных.
- C++ структуры — типы значения (value type), а не ссылочные. Используйте struct, если не планируете менять данные после создания.
Инициализация структуры в C++
Для создания структуры используют ключевое слово struct и идентификатор. Идентификатор становится именем структуры. Синтаксис:
struct struct_name {
// члены структуры
}
Внутри фигурных скобок объявляются члены — они могут быть разных типов.
Пример:
struct Person {
char name[30];
int citizenship;
int age;
}
Здесь Person — структура с тремя членами: name (char), citizenship и age (int). При объявлении структуры память не выделяется — она выделяется при создании переменной этого типа.
Создание экземпляров структуры
В примере выше мы создали структуру Person. Переменную структуры можно создать так:
Person p;
p — переменная типа Person. Через неё получают доступ к членам структуры.
Доступ к членам структуры
Для доступа к членам используют экземпляр структуры и оператор точка (.). Например, доступ к члену age структуры Person:
p.age = 27;
Мы обратились к члену age через экземпляр p и установили значение 27.
Пример 1: Базовое использование структуры
#include <iostream>
using namespace std;
struct Person {
int citizenship;
int age;
};
int main(void) {
struct Person p;
p.citizenship = 1;
p.age = 27;
cout << "Person citizenship: " << p.citizenship << endl;
cout << "Person age: " << p.age << endl;
return 0;
}
Вывод:

Скриншот кода:

Разбор кода:
- Подключаем
iostream. - Используем пространство имён
std. - Создаём структуру
Person. - Начало тела структуры.
- Член
citizenshipтипа int. - Член
ageтипа int. - Конец тела структуры.
- Вызов
main(). - Создание экземпляра
Personс именемp. - Установка
citizenship= 1. - Установка
age= 27. - Вывод
citizenship. - Вывод
age. - Возврат 0 при успехе.
- Конец
main().
Указатели на структуру
Можно создать указатель, указывающий на структуру. Это аналогично указателям на встроенные типы (int, float, double и т.д.). Указатель хранит адрес в памяти.
Пример 2: Указатель на структуру
#include <iostream>
using namespace std;
struct Length {
int meters;
float centimeters;
};
int main() {
Length *ptr, l;
ptr = &l;
cout << "Enter meters: ";
cin >> (*ptr).meters;
cout << "Enter centimeters: ";
cin >> (*ptr).centimeters;
cout << "Length = " << (*ptr).meters << " meters " << (*ptr).centimeters << " centimeters";
return 0;
}
Вывод:

Скриншот кода:

Разбор кода:
- Подключаем
iostream. - Используем
std. - Создаём структуру
Length. - Начало тела структуры.
- Член
metersтипа int. - Член
centimetersтипа float. - Конец тела структуры.
- Вызов
main(). - Создание указателя
*ptrи обычной переменнойlтипаLength. - Сохранение адреса
lв указателе. - Вывод приглашения ввести метры.
- Чтение значения через указатель (член
meters). - Вывод приглашения ввести сантиметры.
- Чтение значения через указатель (член
centimeters). - Вывод прочитанных значений.
- Возврат 0 при успехе.
- Конец
main().
Структура как аргумент функции
Структуру можно передать функции в качестве аргумента. Это делается так же, как передача обычного аргумента. Переменные структуры также можно передавать. Хороший пример — вывод значений членов структуры.
Пример 3: Передача структуры в функцию
#include <iostream>
using namespace std;
struct Person {
int citizenship;
int age;
};
void func(struct Person p);
int main() {
struct Person p;
p.citizenship = 1;
p.age = 27;
func(p);
return 0;
}
void func(struct Person p) {
cout << " Person citizenship: " << p.citizenship << endl;
cout << " Person age: " << p.age;
}
Вывод:

Скриншот кода:

Разбор кода:
- Подключаем
iostream. - Используем
std. - Создаём структуру
Person. - Начало тела структуры.
- Член
citizenshipтипа int. - Член
ageтипа int. - Конец тела структуры.
- Объявление функции, принимающей экземпляр
Person. - Вызов
main(). - Создание экземпляра
Personс именемp. - Установка
citizenship= 1 черезp. - Установка
age= 27 черезp. - Вызов функции с передачей
p. - Возврат 0.
- Конец
main(). - Тело функции.
- Начало тела функции.
- Вывод
citizenship. - Вывод
age. - Конец функции.
Ограничения структуры C++
Следующие ограничения существуют для структур:
- Тип struct нельзя обрабатывать как встроенный тип данных.
- Операторы
+,-и другие нельзя применять к переменным структуры. - Структуры не поддерживают сокрытие данных. Члены структуры доступны из любой функции независимо от области видимости.
- Статические члены нельзя объявлять внутри тела структуры (в C++03; в C++11+ можно).
- Конструкторы нельзя создавать внутри структуры (в C++03; в современном C++ структуры могут иметь конструкторы).
Резюме:
- Структура — тип данных, хранящий элементы разных типов.
- Массив хранит элементы одного типа, структура — разных типов.
- Структуру используют, когда элементы не должны менять значения.
- Члены структуры доступны через оператор точка (
.). - Нужно создать экземпляр структуры.
- Для создания структуры используют ключевое слово
struct. - Указатели на структуру создаются аналогично указателям на встроенные типы.
- Структуру можно передавать в функцию как обычный аргумент.
Язык C
- Освоение структур и указателей в C: практическое руководство
- Цикл do-while в C++: синтаксис, примеры и вложенные циклы
- Оператор switch-case в C++: синтаксис, применение и практические примеры
- Динамическое выделение массивов в C++: практическое руководство с примерами кода
- Указатели в C++: концепции, примеры и практические применения
- Тип данных char в C++: объявление, ASCII и методы преобразования
- Перегрузка операторов в C++: практическое руководство с примерами кода
- Освоение std::list в C++: синтаксис, функции и практические примеры
- Функции в C++: подробное объяснение с практическими примерами кода
- C++ Struct vs Class: ключевые отличия, синтаксис и лучшие сценарии использования