Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Структуры
Структура — это совокупность переменных (называемых членами, элементами или полями), объединенных под одним именем. Объявление структуры выглядит следующим образом:
struct [<Название структуры>] {
<Тип данных> <Название поля 1>;
...
<Тип данных> <Название поля N>;
} [<Объявления переменных через запятую>];
Допустимо не задавать название структуры, если после закрывающей фигурной скобки указано объявление переменной. Точка с запятой в конце объявления структуры является обязательной.
Объявление структуры только описывает новый тип данных, а не определяет переменную, поэтому память под нее не выделяется. Чтобы объявить переменную, ее название указывается после закрывающей фигурной скобки при объявлении структуры или отдельно, используя название структуры в качестве типа данных:
[struct ]<Название структуры> <Названия переменных через запятую>;
В языке C++ ключевое слово struct
при объявлении переменной можно не указывать. Пример одновременного объявления структуры и переменной:
struct Point {
int x;
int y;
} point1;
Пример отдельного объявления переменной:
Point point2;
Одновременно с объявлением переменной можно выполнить инициализацию полей структуры, указав значения внутри фигурных скобок:
Point point3 = {10, 20};
Можно также в списке инициализации указать точку и название поля структуры, а после оператора =
— присваиваемое значение:
Point point4 = {.x = 10, .y = 20};
После объявления переменной выделяется необходимый размер памяти. Для получения размера структуры внутри программы следует использовать оператор sizeof
:
<Размер> = sizeof <Переменная>;
<Размер> = sizeof (<Название структуры>);
Пример:
std::cout << sizeof point1 << std::endl; // 8
std::cout << sizeof(Point) << std::endl; // 8
Присвоить или получить значение поля можно с помощью точечной нотации:
<Переменная>.<Название поля> = <Значение>;
<Значение> = <Переменная>.<Название поля>;
Пример:
point1.x = 10;
point1.y = 20;
std::cout << point1.x << std::endl; // 10
std::cout << point1.y << std::endl; // 20
Одну структуру можно присвоить другой структуре с помощью оператора =
. В этом случае копируются значения всех полей структуры. Пример:
point2 = point1;
std::cout << point2.x << std::endl; // 10
std::cout << point2.y << std::endl; // 20
После оператора =
и при передаче структуры в качестве параметра в функцию, допускается указание составного литерала. Литерал структуры состоит из круглых скобок, внутри которых указывается ключевое слово struct
(в языке C++ ключевое слово struct
можно не указывать) и название структуры, и фигурных скобок, внутри которых через запятую перечисляются значения:
point4 = (Point) {30, 40};
// point4 = (struct Point) {30, 40};
std::cout << point4.x << std::endl; // 30
std::cout << point4.y << std::endl; // 40
Структуры можно вкладывать. При обращении к полю вложенной структуры дополнительно указывается название структуры родителя. В качестве примера объявим структуру Point
(точка), а затем используем ее для описания координат прямоугольника (листинг 3.22). Структуру, описывающую прямоугольник, объявим без названия.
Листинг 3.22. Использование вложенных структур
#include <iostream>
struct Point { // Объявление именованной структуры
int x;
int y;
};
struct { // Объявление структуры без названия
Point top_left;
Point bottom_right;
} rect, rect2 = { {10, 20}, {30, 40} };
int main() {
rect.top_left.x = 0;
rect.top_left.y = 0;
rect.bottom_right.x = 100;
rect.bottom_right.y = 100;
std::cout << rect.top_left.x << ' '
<< rect.top_left.y << std::endl // 0 0
<< rect.bottom_right.x << ' '
<< rect.bottom_right.y << std::endl; // 100 100
std::cout << rect2.top_left.x << ' '
<< rect2.top_left.y << std::endl // 10 20
<< rect2.bottom_right.x << ' '
<< rect2.bottom_right.y << std::endl; // 30 40
std::cout << sizeof rect << std::endl; // 16
return 0;
}
Можно также создавать анонимные вложенные структуры:
struct MyStruct {
int a;
struct { // Анонимная вложенная структура
int b;
int c;
};
int d;
};
Инициализация и доступ к полям осуществляется следующим образом:
MyStruct my_struct = {1, {2, 3}, 4};
std::cout << my_struct.a << std::endl; // 1
std::cout << my_struct.b << std::endl; // 2
std::cout << my_struct.c << std::endl; // 3
std::cout << my_struct.d << std::endl; // 4
Адрес структуры можно сохранить в указателе. Объявление указателя на структуру производится так же как и на любой другой тип данных. Для получения адреса структуры используется оператор &
, а для доступа к полю структуры вместо точки применяется оператор ->
. Пример использования указателя на структуру приведен в листинге 3.23.
Листинг 3.23. Использование указателя на структуру
#include <iostream>
struct Point { // Объявление структуры и переменной
int x;
int y;
} point1;
int main() {
Point *p = &point1; // Объявление указателя
p->x = 10;
p->y = 20;
std::cout << p->x << ' ' << p->y << std::endl; // 10 20
std::cout << (*p).x << ' ' << (*p).y << std::endl; // 10 20
return 0;
}
В языке C++ структуры имеют функционал, аналогичный классам. Единственное отличие состоит в том, что доступ к членам структуры является открытым, а доступ к членам класса по умолчанию является закрытым. И в том и другом случае поведение по умолчанию можно изменить. Например, объявление класса Point
с отрытым доступом к членам выглядит так:
class Point { // Объявление класса и переменной
public:
int x;
int y;
} point1;
Как видно из примера, объявление класса производится так же как и объявление структуры, только вместо ключевого слова struct
используется слово class
. Отличие только в указании ключевого слова public
перед объявлением членов класса, которое открывает доступ к членам класса извне. Как уже говорилось, по умолчанию доступ к членам класса извне закрыт. Классы мы рассмотрим подробно в отдельной главе при изучении объектно-ориентированного программирования.
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов