Часть 2

Со структурами C++ мы предварительно познакомились в предыдущей статье. Продолжаем знакомство.

Определение структуры желательно располагать за пределами main() функции. Тогда работать с ней смогут и другие определенные программистом функции, как показано в нашем примере из первой части. Такое объявление называют внешним.

Инициализация. Элементы структуры можно инициализировать сразу при объявлении объекта.

#include<iostream>

using namespace std;

 

struct Size

{

int breast;

int waist;

int hips;

};

 

int main()

{

Size volume1 { 90, 60, 90 };

return 0;

}

Объявляем объект volume1 в строке 13 и проводим его инициализацию. Похоже на инициализацию элементов массива — в фигурных скобках и через запятую. Эти данные запишутся в соответствующие элементы структуры по порядку. В каком порядке определены элементы в структуре — в таком и произойдет запись значений. Операцию равно можно не использовать (согласно C++11).

Рассмотрим такую инициализацию на примере с более сложной структурой WonderfulWoman :

Объект этой структуры можно инициализировать так:

Но если структура содержит больше двух-трех элементов -желательно так не делать. Это немного запутывает и усложняет читаемость и понимание программы.

Объявление объектов. Создать объект структуры можно сразу во время её определения. Для этого необходимо дать имя объекту между точкой с запятой и закрывающей фигурной скобкой:

#include<iostream>

using namespace std;

 

struct Size

{

int breast;

int waist;

int hips;

} volume1, volume2; // объявляем два объекта

 

int main()

{

setlocale(LC_ALL, "rus");

 

volume1 = { 90, 60, 90 };

volume2 = { 100, 100, 100 };

return 0;

}

В С++ есть возможность определить структуру без дескриптора (без имени типа):

#include<iostream>

using namespace std;

 

struct // дескриптор отсутствует

{

int breast;

int waist;

int hips;

} volume1, volume2; // объявляем два объекта

 

int main()

{

setlocale(LC_ALL, "rus");

 

volume1 = { 90, 60, 90 };

volume2 = { 100, 100, 100 };

 

return 0;

}

В таком случае надо обязательно объявлять объекты в определении структуры. В главной функции вы уже не сможете создать другие объекты этой структуры, так как дескриптора нет. Этот прием есть смысл применять, если объектов структуры будет очень мало — 1 или 2.

Присваивание (=) для структур. Для объектов одной структуры можно применить операцию присваивания = . Операция присвоит элементам одного объекта значения элементов второго объекта.

#include<iostream>

using namespace std;

 

struct Size

{

int breast;

int waist;

int hips;

} volume1, volume2; // объявляем два объекта

 

int main()

{

setlocale(LC_ALL, "rus");

 

volume1 = { 90, 60, 90 };

volume2 = volume1;

 

cout << volume2.breast << '/';

cout << volume2.waist << '/';

cout << volume2.hips << endl;

return 0;

}

Это так называемое поэлементное или почленное присваивание. На экране:

Сработало — все элементы объекта структуры volume2 стали равны элементам объекта volume1.

Память занимаемая структурой. Рассмотрим пример: используя оператор sizeof, узнаем сколько памяти занимает каждый элемент структуры в отдельности. Посчитаем общий объем памяти элементов. Потом применим sizeof к объекту структуры и увидим, что размеры не совпадают.

#include<iostream>

using namespace std;

 

struct HandsomeMan

{

char name[16];

int age;

int height;

bool engKnowledge;

};

 

int main()

{

setlocale(LC_ALL, "rus");

 

HandsomeMan Man = {};

 

cout << "sizeof(Man.name)           = " << sizeof(Man.name) << endl;

cout << "sizeof(Man.age)            = " << sizeof(Man.age) << endl;

cout << "sizeof(Man.height)         = " << sizeof(Man.height) << endl;

cout << "sizeof(Man.engKnowledge)   = " << sizeof(Man.engKnowledge) << endl;

cout << "Total size of the elements = ";

cout << sizeof(Man.name) + sizeof(Man.age) + sizeof(Man.height) + sizeof(Man.engKnowledge);

cout << endl << endl;

 

cout << "Size of struct = " << sizeof(Man) << endl;

 

return 0;

}

На экране:

sizeof показал нам сколько памяти занимает каждый элемент структуры HandsomeMan. Мы эти значения суммировали и получили 25. То есть по идее структура должна занимать 25 байт оперативной памяти. Но когда мы применяем оператор sizeof к структуре — получаем значение 28.

Размер объекта структуры не всегда равен сумме размеров его элементов. Так случается из-за выравнивания элементов разной длины. Поэтому в структуре могут встречаться безымянные участки памяти. Если вам надо знать сколько в действительности занимает структура в памяти — примените sizeof , как в примере.