Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_раб_8С++.doc
Скачиваний:
32
Добавлен:
18.03.2015
Размер:
156.16 Кб
Скачать

1.2 Описание и инициализация структур

Структура предназначена для объединения нескольких переменных в один тип данных. Сначала тип структуры надо описать, а затем можно создавать переменные этого нового типа. Описание типа структуры "T" имеет следующий синтаксис:

struct T {

T1 var1;

T2 var2;

...

T3 var3; };

где "T1", "T2", "T3" – имена встроенных типов данных ("int", "char" и др.) или других составных типов. "var1", "var2", "var3" – это имена внутренних переменных структуры.

Элементы структуры называются полями структуры и могут иметь любой тип, кроме типа этой же структуры, но могут быть указателями на него. Если отсутствует имя типа, должен быть указан список описателей переменных, указателей или массивов. Далее приведены три примера описания структур для представления комплексных чисел, дат и сведений о людях:

struct Complex {

double re;

double im; };

struct Date {

int day;

int month;

int year; };

struct Person {

char name[50];

Date birthdate;

double salary; };

Обратите внимание на точку с запятой в конце описания типа структуры. Это одно из очень немногих мест в С++, где необходимо ставить точку с запятой после фигурной скобки. На примере типа "Person" видно, что компоненты структуры могут, в свою очередь, тоже быть составными. Переменные типа структуры описываются аналогично переменным встроенных типов:

Complex z; Date d; Person p;

В операторе описания переменные можно инициализировать путем перечисления значений компонент в фигурных скобках (аналогично инициализации массивов):

Complex z = { 1.6, 0.5 };

Date d = { 1, 4, 2001 };

Person p = { "Сидоров", {10, 3, 1978}, 1500.48 };

Для обращения к отдельным компонентам структуры применяется операция "." (точка). Сначала указывается имя переменной-структуры, а затем – имя компоненты. Например:

z.im = 3.2; d.month = 7; p.birthdate.year = 1980; p.salary = 2000.00;

Важно отметить, что не все возможные комбинации значений компонент структуры могут иметь смысл применительно к конкретной задаче. Например, тип "Date", определенный выше, включает значения {50, 5, 1973} и {100, 22, 1815}, хотя дней с такими датами не существует. Т.о., определение этого типа не отражает реального положения вещей, но все же оно достаточно близко к практическим целям. Ответственность за то, чтобы при выполнении программы не возникали подобные бессмысленные значения, возлагается на программиста.

В программе примера 1 демонстрируется, как в исходном тексте на С++ располагаются описание типа структуры, объявление переменных и обращение к компонентам структуры.

Пример 1

struct SimpleStructure {

char c;

int i;

float f;

double d; };

void main() {

SimpleStructure s1, s2;

s1.c = 'a';

s1.i = 1;

s1.f = 3.14f; // Буква 'f' в конце вещественной константы

// означает, что это константа типа float,

s2.c = 'b';

s2.i = 2;

s2.f = 6.28f;

s2.d = 0.15;

}

В примере 1 в функции "main()" создаются две переменные типа "SimpleStructure" с именами "s1" и "s2". У каждой из этих переменных есть собственный набор компонент с именами "c", "i", "f", и "d". Т.е. "s1" и "s2" являются наборами независимых переменных. Для выбора компонент внутри "s1" или "s2" применяется операция "." (точка). Подобная запись применялась и для обращения к функциям-членам объектов "cin" и "сout". Обращения к компонентам классов в объектно-ориентированном С++ очень похожи на обращения к компонентам структур.

Переменные типа структуры можно присваивать, передавать, как параметры функции, и возвращать из функции в качестве результата. Например:

Person current;

Person set_current_person( Person& p )

{Person prev = current;

current = p;

return prev; }

Остальные операции, такие, как сравнение ("==" и "!="), для структур по умолчанию не определены, но программист может их определить при необходимости.

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

struct S; // S - имя некоторого типа

S f();

void g(S v1);

Но эти функции нельзя вызывать, если тип "S" не определен:

void h() {

S a; // ошибка: S не объявлено

f(); // ошибка: S не объявлено

g(a); // ошибка: S не объявлено }

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]