Структуры - введение в объектно-ориентированное программирование

Раньше для хранения данных использовались простые типы данных: числа, строки и т.д. Тем не менее, многие объекты, которые возникают в программировании, нельзя охарактеризовать только одной числовой или строковой величиной. Например, точка на плоскости задается парой действительных чисел (x, y), а данные о человеке можно задавать при помощи нескольких строк (фамилии, имени, отчества) и числового параметра: года рождения.

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

Для этого используются специальные типы данных, которые в языке C называются структурами, а в языке C++ классами. Например, структура Point, задающая точку на плоскости и содержащая два действительных числа x и y может быть задана следующим образом:

struct Point
{
    double x;
    double y;
};

Переменные x и y, входящие в структуру Point, называются полями структуры. Определение структуры дается вне всех функций (и, обычно делается перед объявлением всех функций). Определение структуры обязательно завершается точкой с запятой.

После этого мы можем работать с Point, как с новым типом данных, содержащим два поля: x и y. Примеры создания переменной и массива переменных типа Point:

     Point P, Arr[10];

Чтобы обратиться к полю какой-либо структуры, используется оператор "точка". Его левый операнд – идентификатор переменной типа структура, правый операнд – имя поля. Например, P.x или Arr[i].y.

Например, считать координаты точки, сохранить их в переменной P и вывести на экран расстояние от начала координат до этой точки можно следующим образом:

     cin >> P.x >> P.y;
     cout << sqrt(P.x * P.x + P.y * P.y);

По сути, величины P.x и P.y являются независимыми переменными, скомбинированными в один объект. С этим объектом можно работать, как с единым целым, например, можно выполнять присваивания вроде Arr[i]=P, можно сохранить набор точек в одном массиве и т.д.

Аналогично, можно определить структуру типа Person для хранения информации о человеке:

     struct Person
     {
         string FirstName; // Имя
         string LastName;  // Фамилия
         int    BirthYear; // Год рождения
     };

Теперь можем работать с данными типа Person:

     Person Vasya;
     Vasya.FirstName = "Василий";
     Vasya.LastName = "Пупкин";
     Vasya.BirthYear = 1990;
     cout << Vasya.FirstName << " " << Vasya.LastName <<
         " родился в " << Vasya.BirthYear << " году" << endl;

Полями структур могут быть произвольные типы данных. Можно, например, создать структуру, полями которой будут массивы или другие структуры.

Например, пусть мы хотим определить структуру Circle для определения окружности. Окружность задается центром и радиусом. Радиус – это действительное число (поле Radius типа double), а центр – это, конечно же, точка, то есть поле Center имеет тип Point . Получили:

     struct Circle
     {
         Point Center;
         double Radius;
     };

Дальше с такими "вложенными" структурами можно работать так:

     Circle A;
     A.Radius = 10;
     A.Center.x = -3;
     A.Center.y = 15;