Изучив структуры C++ в этом уроке, перед вами по настоящему приоткроется пространство для творчества в программировании. До этого урока, мы могли использовать стандартные (встроенные) типы данных для переменных в своих программах (int, float, char, bool). Сейчас же мы научимся самостоятельно создавать что-то вроде своего собственного типа данных. Это делается при помощи структур.
Как всегда, в начале статьи разберемся зачем нам это может понадобиться. Допустим, необходимо сохранить данные о девушке модели. Нам надо хранить о ней такие данные: имя, возраст, рост, вес, объёмы и знание/незнание английского языка. Как видите, все данные о модели будут отличаться типами: имя надо хранить в массиве типа char, объемы – в переменных типа int, для отметки о владении английским подойдет переменная типа bool…
Получается, что для хранения этих данных, массив мы никак не сможем использовать, так как он хранит однотипные данные. Используя структуры появляется возможность сгруппировать все эти данные, условно объединенные логической связью, в одно целое. Смотрим:
Для определения структуры используется ключевое слово struct. После него указывается дескриптор (имя нового типа данных). Имя дает программист. Оно подчиняется тем же правилам, что и имена переменных. У нас дескриптор структуры – это WonderfulWoman.
В фигурных скобках размещаются элементы (члены) структуры – именованные переменные или массивы любого типа данных С++. Структура может хранить элементы разных типов. Как видите в нашей структуре есть элементы типа int, char и bool. Завершается определение структуры точкой с запятой ;
После того, как структура определена, мы можем создавать переменные типа структуры – объекты структуры. Создаются они точно так же, как и переменные типа bool, int, char… Пишем дескриптор (“тип”) и даем имя объекту структуры. Например в main-функции создаем переменную
WonderfulWoman firstWoman; Здесь WonderfulWoman будет играть роль типа, а firstWoman – роль объявленной переменной.
Элементом структуры также может быть объект другой, определённой ранее, структуры. То есть структуры можно вкладывать одну в другую. Рассмотрим пример. В нём также разберемся, как обращаться к элементам структуры, чтобы записать в них данные, например, и затем показывать на экран.
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | #include<iostream> using namespace std; struct Size // эту структуру мы вложим в структуру WonderfulWoman { int breast; // объем груди int waist; // талии int hips; // бёдер }; struct WonderfulWoman { char name[32]; int age; int height; int weight; Size volume; // вложенная структура bool engKnowledge; }; void showData(const WonderfulWoman &Obj); int main() { setlocale(LC_ALL, "rus"); WonderfulWoman firstWoman = {}; // установит значения всех элементов структуры в 0 // присвоение значений элементам структуры strcpy_s(firstWoman.name, "Оксана"); firstWoman.age = 23; firstWoman.height = 172; firstWoman.weight = 55; firstWoman.engKnowledge = 1; // присвоение значений элементам вложенной структуры firstWoman.volume.breast = 90; firstWoman.volume.waist = 60; firstWoman.volume.hips = 90; showData(firstWoman); return 0; } void showData(const WonderfulWoman &Obj) { cout << "Модель: " << Obj.name << endl; cout << "Возраст: " << Obj.age << endl; cout << "Рост: " << Obj.height << endl; cout << "Вес: " << Obj.weight << endl; cout << "Объемы: " << Obj.volume.breast << '/' << Obj.volume.waist << '/' << Obj.volume.hips << endl; cout << "Английский (1 - да, 0 - нет): " << Obj.engKnowledge << endl; cout << endl; } |
Идем по порядку. Строки 4 – 9: определение структуры Size. Она содержит три элемента типа int, которые будут хранить замеры модели – объемы груди, талии, бёдер. Эту структуру мы вложим в расположенную под ней структуру – WonderfulWoman. Она содержит элементы разных типов – символьный массив, переменные типа int, bool.
В строке 17 объявлен объект volume типа Size. Это и есть вложение структуры. В 21-й строке находится прототип функции, которая будет отображать данные структуры WonderfulWoman на экран. Об этой функции поговорим ниже, когда дойдем до её определения.
Строка 27 – объявление объекта структуры: WonderfulWoman firstWoman = {}; Тут понятно: WonderfulWoman – дескриптор (тип), firstWoman – объект структуры. Такая запись = {}; установит все значения элементов структуры WonderfulWoman в ноль. В том числе, всем элементам символьного массива будет присвоено значение \0 . Так как объект volume является элементом структуры WonderfulWoman, его элементам так же будут присвоены нули. То есть такая запись позволит очистить все элементы структуры от мусора (остаточных данных от других программ).
Обращение к элементам структуры. Чтобы записать или извлечь данные нам надо обратиться к конкретному элементу объекта структуры. Для этого применяется операция принадлежности . (точка): firstWoman.age = 23; Надо нам внести данные о возрасте – пишем имя объекта структуры, за ним . (точка) и далее имя элемента структуры, в котором должно храниться количество лет модели. Чтобы сохранить имя – используем библиотечную функцию strcpy_s() или strcpy() (в зависимости от вашей среды разработки).
Внимательно посмотрите на строки 36 – 38. Там мы присваиваем значения элементам вложенной структуры. Например: firstWoman.volume.breast = 90; Как и раньше пишем имя объекта структуры, за ним . (точка). Далее имя объекта вложенной структуры, снова . (точка). И только теперь выбираем элемент вложенной структуры breast, к которому надо обратиться.
Последнее – структуру свободно можно передавать в функцию и возвращать из функции, как и обычные переменные. Определение функции для вывода данных структуры на экран – в строках 45 – 54. Так как нам надо только показать данные и очень желательно их не испортить в функции, передаем структуру с использованием оператора const. Вызов функции находится в строке 40. Тут просто передаем объект структуры в функцию, указав его имя. Результат:
Домашнее задание для вас: написать еще одну функцию для нашей программы, в которой пользователю предлагается вводить данные о модели с клавиатуры. Внести данные надо будет о трёх моделях и показать их на экран.
В этом видео рассказано о структурах с 4-й минуты:
В этой статье (первой части) мы очень поверхностно рассмотрели структуры C++. В дополнительной статье (во второй части) о структурах еще поговорим об особенностях определения структуры, об инициализации объектов структуры, о присваивании структур с использованием операции = и о том сколько памяти выделяется под объекты структур.
меня всегда пугают новые темы в С++. Так и со структурами ))) Страшно было и подступиться. Почитала то там, то там. Потом зашла на ваш сайт – как всегда все коротко и понятно. Жду вторую часть урока о структурах. И массив структур очень интересует :)
Здравствуйте! Подскажите, а откуда взялось &Obj в 45 строке? Я думал это ссылка на переменную Obj, но она нигде не объявлена. В общем, с этим я запутался. Разъясните пожалуйста.
Извиняюсь, затупил! Уже разобрался!
“Тут просто передаем обьект структуры в функцию, указав его имя”. Но ведь у нас имя обьекта структуры – это firstWoman, а мы передаем Obj. А если обьектов будет несколько, как передать конкретный из них?
Извините, дошло
здравствуйте! я новичок, вопрос, правильно ли этот код складывает футы и дюймы?
#include “stdafx.h”
#include
using namespace std;
struct Distance
{
int feet;
float inches;
};
Distance addengls(Distance, Distance);
void engldisp(Distance);
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(0, “”);
Distance d1, d2, d3;
cout <> d1.feet;
cout <> d1.inches;
cout <> d2.feet;
cout <> d2.inches;
d3 = addengls(d1, d2);
cout <<endl;
engldisp(d1); cout << " + ";
engldisp(d2); cout << " = ";
engldisp(d3); cout <= 12.0)
{
dd3.inches -= 12.0;
dd3.feet++;
}
dd3.feet += dd1.feet + dd2.feet;
return dd3;
}
void engldisp(Distance dd)
{
cout << dd.feet << "\'-" << dd.inches << "\"";
}
Гм, а до меня не дошло.
Конструкция &Obj нигде раньше не встречалась и тут, безо всяких пояснений – нате, хавайте.