Назад | Начало урока | Вперед
Содержание

Глава 9

Структуры данных



В этой главе...

В предыдущей главе рассматривались простые типы данных и способы использования
переменных для хранения информации. Но предположим, что необходимо сохранить
более сложную информацию, которая не может быть представлена только лишь одной переменной какого-то определенного типа данных. Например, информацию о сотруднике, которая включает его имя, адрес и телефонный номер. Если рассматривать только простые типы данных, вы должны использовать для этой цели три различные переменные: одну для представления имени, вторую для адреса и третью для телефонного номера.

Такой подход нельзя назвать самым удачным, поскольку в реальном мире почти каждое явление описывается целым набором разных значений. Представим, например, что вам необходимо отобразить информацию о сотруднике. Несмотря на то что эта информация состоит из разных частей (имя, адрес, телефон и т.п.), вы все равно представляете ее как нечто целое.
По крайней мере намного предпочтительнее и удобнее сказать: "отобрази информацию о сотруднике", чем: "отобрази имя сотрудника, его адрес, телефон и т.д.".

В этой главе описано, как объединить несколько отдельных переменных в нечто целое, называемое структурой. Группируя связанные по смыслу элементы в общую структуру, вы значительно упрощаете чтение и понимание кодов программ. Возможно, вы будете использовать структуры во всех своих будущих программах, по крайней мере в этой книге вы будете часто с ними встречаться. В главе 17 рассматривается, как обычные структуры могут быть преобразованы в классы — самые главные компоненты, из которых строятся объектно-ориентированные программы.

Вверх

Объявление структур

Объявление структур во многом похоже на объявление обычных типов данных (см. главу 7).

Чтобы объявить структуру, наберите слово class , затем укажите название структуры. Дапее в фигурных скобках наберите public : и объявите переменные, из которых будет состоять структура.
Вот пример объявления структуры:

class CircleInfo
{

public:
double dblRadius;
double dblArea;
};

В данном случае структура названа именем Circlelnfо (Информация о круге). Она состоит из переменной dblRadius типа double, в которой хранится значение радиуса крута, и переменной dblArea (также типа double), в которой хранится значение площади круга.

Чтобы определить переменную, которая будет представлять структуру, просто наберите название структуры и затем название переменной.

//Создание переменной, представляющей структуру
Circlelnfo oCircle;

Что в действительности означает определение переменной, представляющей структуру? Приведенной выше строкой была создана переменная oCircle типа Circlelnfo. Это означает, что переменная cCircIe содержит две другие переменные — dblRadius и dblArea, поскольку эти переменные определены для структуры CircleTnfo. Можно сказать, что одна переменная (oCircle) типа Circlelnfo содержит несколько значений (dblRadius и dblArea).

Объединяя различные переменные в отдельные структуры, можно логически правильно
организовать используемую в программе информацию. Далее вы узнаете, как используются переменные, представляющие структуру.

Разница между объявлением и определением

В C++ объявление и определение являются техническими терминами. Их смысл несколько различается, но часто их используют как взаимозаменяемые (хотя по сути это неправильно).

Обьявляя структуру, вы сообщаете компьютеру, из чего эта структура будет состоять. Например:

class Circlelnfo
{

public:
double dblRadius;
double dblArea;
} ;

При этом память для структуры не выделяется.

Определяя переменную, вы даете компьютеру указание создать эту переменную.
В этом случае для создаваемой переменной выделяется память:

Circlelnfo oCircle;

Использование этих загадочных структур

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

Например, чтобы отобразить значение радиуса крута, наберите такой код:

//Создание переменней, представляющей структуру
Circlelnfo oCircle;

//Отображение части информации, хранимой в структуре,
//которая обозначается именем dblRadius
Console::WriteLine(oCircie.dblRadius.ToString());

Как видите, выражение oCircle.dblRadius выступает здесь в роли обычной переменной. Использование элементов, входящих в структуру, по существу, ничем не отличается от использования стандартных переменных, представляющих только одно значение.

Вверх

Использование одних структур для создания других

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

Например, перед тем как создать структуру MegaCircle, состоящую из структур
Circlelnfo, нужно объявить структуру Circlelnfo . Впрочем, это вполне логично. Нужно просто не запутаться, что и в какой последовательности должно быть объявлено. Если же вы нарушите естественный порядок. Visual C++ .NET выдаст сообщение об ошибке.

Вот пример объявления структуры, состоящей из двух структур Circlelnfo:

class MegaCircle
{

public:
Circlelnfo oTopCircle;
Circielnfo oBottomCircle;
}

Вверх

Структуры на практике

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


//CircleArea3
//Вычисление площади по значению радиуса
//Использование структуры для представления данных

#include "stdafx.h"
#using <mscorlib.dll>
using namespace System;

//Объявление структуры для представления информации
//о параметрах круга
class Circlelnfo
{

public:
double dblRadius;
double dblArea;
}

//С этой строки начинается выполнение программы
#ifdef _UNICODE
int wmain(void)
#else
int main(void)
#endif
{

const double PI = 3.141592;
CircleInfo oCircle;

//Отображение вопроса о значении радиуса
Console::WriteLine(S"Укажите радиус круга");

//Получение ответа и преобразование его к числу с
//плавающей запятой
oCircle.dblRadius = Double::Parse(Console::ReadLine());

//Вычисление плошади круга
oCircle.dblArea = PI*oCircle.dblRadius*oCircle.dblRadius;

//Отображение результата на экране
//Обратите вникание, что для этого число должно
//быть предварительно прообразовано в строку
Console::WriteLine(S"Площадь круга составляет {0} единиц,", oCircle.dblArea.ToString ());

//Ожидание, пока пользователь не остановит
//выполнение программы
Console::WriteLine(S"Нажмите клавишу Enter, чтобы остановить выполнение программы");
Console;:ReadLine();
return 0;

}


Код программы в файле CircleArea3

Вы могли обратить внимание на несколько интересных моментов в этой программе. Так, структура Circlelnfo была объявлена перед функцией main (это функция, с которой начинается выполнение программы). Именно так и нужно делать, поскольку структура должна быть объявлена до того, как вы начнете ее использовать. В данном случае функция main использует структуру Circlelnfo . поэтому она и должна быть объявлена перед кодами функции main. Это общий принцип для всех программ на C++. Сначала объявляется класс. Определяются все его функции. И только после этого класс можно использовать.

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

Кое-что о структурах и классах

В этой книге при создании структур будет использоваться ключевое слово class. Это же слово используется и при создании классов. (О них речь идет в главе 17.)
В действительности в языке C++ есть два слова, которые могут быть использованы для объявления структур (или классов): class и struct . Использование слова struct почти эквивалентно использованию слова сlass, за исключением лишь того, что в этом случае вам не обязательно добавлять слово public : перед описанием переменных, входящих в структуру.

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

Когда вы поближе познакомитесь с классами (начиная с главы 17), вы узнаете, что означает слово public, а также слова private и protected. Если вы применяете слово struct, по умолчанию используется слово public , а если class - слово private. Наш совет: чтобы не путаться, постоянно используйте слово class при объявлении классов и структур.

Почему два ключевых слова выполняют практически одни и те же функции? Слово struct использовалось еще в языке С и было оставлено для того, чтобы программы, написанные на языке С, можно было компилировать с помощью компилятора C++. В языке C++ этому слову добавили немного функциональности, и теперь оно почти идентично слову class. Но, поскольку вы являетесь программистами на C++, используйте при написании своих программ только слово class ,


Назад | Начало урока | Вверх | Вперед
Содержание