Структуры

Структура — это совокупность переменных (называемых членами, элементами или полями), объединенных под одним именем. Объявление структуры выглядит следующим образом:

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

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов