Со структурами C++ мы предварительно познакомились в предыдущей статье. Продолжаем знакомство.
Определение структуры желательно располагать за пределами main() функции. Тогда работать с ней смогут и другие определенные программистом функции, как показано в нашем примере из первой части. Такое объявление называют внешним.
Инициализация. Элементы структуры можно инициализировать сразу при объявлении объекта.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #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 :
Объект этой структуры можно инициализировать так:
Но если структура содержит больше двух-трех элементов -желательно так не делать. Это немного запутывает и усложняет читаемость и понимание программы.
Объявление объектов. Создать объект структуры можно сразу во время её определения. Для этого необходимо дать имя объекту между точкой с запятой и закрывающей фигурной скобкой:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #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; } |
В С++ есть возможность определить структуру без дескриптора (без имени типа):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #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.
Присваивание (=) для структур. Для объектов одной структуры можно применить операцию присваивания = . Операция присвоит элементам одного объекта значения элементов второго объекта.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #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 к объекту структуры и увидим, что размеры не совпадают.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #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 , как в примере.
Это видео из предыдущего урока. Кто не смотрел – уделите время
Мы узнали как определять структуры, как объявлять и инициализировать их объекты. Если нам понадобится создать больше чем 2-3 объекта структуры, тогда лучше создать массив структур. Эту тему рассмотрим в следующей статье.
Только структуру нужно было назвать PrettyWoman ;)
странно, но с именем в структуре беда, а точнее когда вводишь
volume = { “имя”, и тд ;
А кто вас учил такое вводить?
Где вы такое в примерах видели?
Дан массив, в котором хранятся данные о расписании поездов на сего-
дняшний день: номер поезда, название (т.е. откуда – куда, например, Ново-
российск-Москва), время прибытия на станцию и время отправления (часы,
минуты). По данному времени определить, какие из поездов стоят сейчас на
станции.
Нужно вывести данные тех студентов, у которых оценки по математике 8 или 9 и фамилия начинается на А. Почему нельзя нельзя сравнивать адрес и что-то ещё в операторе if??
#include
using namespace std;
struct Grades // эту структуру мы вложим в структуру Student
{
int physics;
int maths;
int informatics;
int chemistry;
};
struct Student
{
char surname[32];
int year_of_birth;
int number_of_groope;
Grades semester_grades; // вложенная структура(оценки за семестр)
double average_score;//средний балл
};
void showData( Student *Obj);
void showData_input(Student *Obj);
int main()
{
setlocale(LC_ALL, “rus”);
Student data[1];
for (int i = 0; i < 3; i++)
{
cout << i + 1 << " student: " << endl;
showData_input(&data[i]);
showData(&data[i]);
if ((&data[i].surname[0]) == 'A' && (&data[i].semester_grades.maths == 8 || 9))
{
showData(&data[i]);
}
}
system("pause");
return 0;
}
void showData( Student *Obj)
{
setlocale(LC_ALL, "rus");
cout << "Фамилия: " <surname << endl;
cout << "Год рождения: " <year_of_birth << endl;
cout << "Номер группы: " <number_of_groope << endl;
cout << " Оценки за семестр: \nФизика: " <semester_grades.physics << "Математика: " <semester_grades.maths << "Информатика: " <semester_grades.informatics<<"Химия: " <semester_grades.chemistry << endl;
cout << "Средний балл: "<average_score;
cout << endl;
}
void showData_input(Student *Obj)
{
setlocale(LC_ALL, "rus");
cout << "__________________" << endl;
cout << "Input student data" << endl;
cout << "__________________" << endl;
cout <> Obj->surname;
cout <> Obj->year_of_birth;
cout <> Obj->number_of_groope;
cout <> Obj->semester_grades.physics >> Obj->semester_grades.maths >> Obj->semester_grades.informatics >> Obj-> semester_grades.chemistry;
cout <> Obj->average_score;
cout << endl;
}
Чет опять без каких-либо пояснений вылезают новые термины и строки, особенно в видео этого много.