Глава 9
В предыдущей главе рассматривались простые типы данных и способы использования
переменных для хранения информации. Но предположим, что необходимо сохранить
более сложную информацию, которая не может быть представлена только лишь одной переменной какого-то определенного типа данных. Например, информацию о сотруднике, которая включает его имя, адрес и телефонный номер. Если рассматривать только простые типы данных, вы должны использовать для этой цели три различные переменные: одну для представления имени, вторую для адреса и третью для телефонного номера.
Такой подход нельзя назвать самым удачным, поскольку в реальном мире почти каждое явление описывается целым набором разных значений. Представим, например, что вам необходимо отобразить информацию о сотруднике. Несмотря на то что эта информация состоит из разных частей (имя, адрес, телефон и т.п.), вы все равно представляете ее как нечто целое.
По крайней мере намного предпочтительнее и удобнее сказать: "отобрази информацию о сотруднике", чем: "отобрази имя сотрудника, его адрес, телефон и т.д.".
В этой главе описано, как объединить несколько отдельных переменных в нечто целое, называемое структурой. Группируя связанные по смыслу элементы в общую структуру, вы значительно упрощаете чтение и понимание кодов программ. Возможно, вы будете использовать структуры во всех своих будущих программах, по крайней мере в этой книге вы будете часто с ними встречаться. В главе 17 рассматривается, как обычные структуры могут быть преобразованы в классы — самые главные компоненты, из которых строятся объектно-ориентированные программы.
Вверх
Объявление структур во многом похоже на объявление обычных типов данных (см. главу 7).
Чтобы объявить структуру, наберите слово class , затем укажите название структуры. Дапее в фигурных скобках наберите public : и объявите переменные, из которых будет состоять структура.
В данном случае структура названа именем Circlelnfо (Информация о круге). Она состоит из переменной dblRadius типа double, в которой хранится значение радиуса крута, и переменной dblArea (также типа double), в которой хранится значение площади круга.
Чтобы определить переменную, которая будет представлять структуру, просто наберите название структуры и затем название переменной.
Что в действительности означает определение переменной, представляющей структуру? Приведенной выше строкой была создана переменная oCircle типа Circlelnfo. Это означает, что переменная cCircIe содержит две другие переменные — dblRadius и dblArea, поскольку эти переменные определены для структуры CircleTnfo. Можно сказать, что одна переменная (oCircle) типа Circlelnfo содержит несколько значений (dblRadius и dblArea).
Объединяя различные переменные в отдельные структуры, можно логически правильно
Разница между объявлением и определением
В C++ объявление и определение являются техническими терминами. Их смысл несколько различается, но часто их используют как взаимозаменяемые (хотя по сути это неправильно).
Обьявляя структуру, вы сообщаете компьютеру, из чего эта структура будет состоять. Например:
При этом память для структуры не выделяется.
Определяя переменную, вы даете компьютеру указание создать эту переменную.
После того как структура создана, чтобы получить доступ к хранимой в ней информации (к значениям переменных, из которых состоит структура), наберите имя переменной, представляющей структуру, затем точку (.) и затем имя переменной, значение которой нужно получить.
Например, чтобы отобразить значение радиуса крута, наберите такой код:
//Отображение части информации, хранимой в структуре,
Как видите, выражение oCircle.dblRadius выступает здесь в роли обычной переменной. Использование элементов, входящих в структуру, по существу, ничем не отличается от использования стандартных переменных, представляющих только одно значение.
Вверх
Можно объединить несколько структур для создания одной большой структуры. Структуры, входящие в состав других структур, называются вложенными.
Например, перед тем как создать структуру MegaCircle, состоящую из структур
Вот пример объявления структуры, состоящей из двух структур Circlelnfo:
Вверх
Ниже приведен код программы CircieArea, который был немного изменен в связи с использованием структуры для представления данных.
#include "stdafx.h"
//Объявление структуры для представления информации
//С этой строки начинается выполнение программы
//Отображение вопроса о значении радиуса
//Получение ответа и преобразование его к числу с
//Вычисление плошади круга
//Отображение результата на экране
//Ожидание, пока пользователь не остановит
Код программы в файле CircleArea3
Вы могли обратить внимание на несколько интересных моментов в этой программе. Так, структура Circlelnfo была объявлена перед функцией main (это функция, с которой начинается выполнение программы). Именно так и нужно делать, поскольку структура должна быть объявлена до того, как вы начнете ее использовать. В данном случае функция main использует структуру Circlelnfo . поэтому она и должна быть объявлена перед кодами функции main. Это общий принцип для всех программ на C++. Сначала объявляется класс. Определяются все его функции. И только после этого класс можно использовать.
Поначалу вам может показаться это несколько странным, поскольку более простые и, по сути, служебные элементы описываются раньше, чем те элементы, в которых они используются. Но по мере приобретения опыта программирования на языке C++ вы к этому привыкнете. Пока же для удобства, если хотите, можете приступить к чтению кодов с того места, где начинается выполнение программы.
В этой книге при создании структур будет использоваться ключевое слово class. Это же слово используется и при создании классов. (О них речь идет в главе 17.)
Некоторые предпочитают использовать слово struct при объявлении структур и слово class при объявлении классов (которые представляют собой те же структуры, содержащие в себе не только переменные, но и функции). Обратите внимание, что для объявления классов также можно использовать слово struct .
Когда вы поближе познакомитесь с классами (начиная с главы 17), вы узнаете, что означает слово public, а также слова private и protected. Если вы применяете слово struct, по умолчанию используется слово public , а если class - слово private. Наш совет: чтобы не путаться, постоянно используйте слово class при объявлении классов и структур.
Почему два ключевых слова выполняют практически одни и те же функции? Слово struct использовалось еще в языке С и было оставлено для того, чтобы программы, написанные на языке С, можно было компилировать с помощью компилятора C++. В языке C++ этому слову добавили немного функциональности, и теперь оно почти идентично слову class. Но, поскольку вы являетесь программистами на
C++, используйте при написании своих программ только слово class ,
Назад |
Начало урока |
Вверх |
Вперед
Объявление структур
Вот пример объявления структуры:
class CircleInfo
{
double dblRadius;
double dblArea;
//Создание переменной, представляющей структуру
Circlelnfo oCircle;
организовать используемую в программе информацию. Далее вы узнаете, как используются переменные, представляющие структуру.
class Circlelnfo
{
double dblRadius;
double dblArea;
В этом случае для создаваемой переменной выделяется память:
Circlelnfo oCircle;
Использование этих загадочных структур
//Создание переменней, представляющей структуру
Circlelnfo oCircle;
//которая обозначается именем dblRadius
Console::WriteLine(oCircie.dblRadius.ToString());
Использование одних структур для создания других
Прежде чем использовать структуру для создания другой структуры, ее нужно объявить.
Circlelnfo, нужно объявить структуру Circlelnfo . Впрочем, это вполне логично. Нужно просто не запутаться, что и в какой последовательности должно быть объявлено. Если же вы нарушите естественный порядок. Visual C++ .NET выдаст сообщение об ошибке.
class MegaCircle
{
Circlelnfo oTopCircle;
Circielnfo oBottomCircle;
Структуры на практике
//CircleArea3
//Вычисление площади по значению радиуса
//Использование структуры для представления данных
#using <mscorlib.dll>
using namespace System;
//о параметрах круга
class Circlelnfo
{
double dblRadius;
double dblArea;
#ifdef _UNICODE
int wmain(void)
#else
int main(void)
#endif
{
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;
Кое-что о структурах и классах
В действительности в языке C++ есть два слова, которые могут быть использованы для объявления структур (или классов): class и struct . Использование слова struct почти эквивалентно использованию слова сlass, за исключением лишь того, что в этом случае вам не обязательно добавлять слово public : перед описанием переменных, входящих в структуру.
Содержание