Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lekcii_1_10 / Лекция 10.docx
Скачиваний:
52
Добавлен:
21.05.2015
Размер:
547.09 Кб
Скачать

Ссылки на структуры

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

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

// Демонстрируем использование ссылки на структуру.

#include <iostream>

using namespace std;

struct mystruct {

 int a; int b;

};

mystruct &f(mystruct &var);

int main()

{

 mystruct x, y;

 x.a = 10; x.b = 20;

 cout << "Исходные значения полей x.a and x.b: ";

 cout << x.a << ' ' << x.b << '\n';

 y = f (x);

 cout << "Модифицированные значения полей x.a и x.b: ";

 cout << x.a << ' ' << x.b << '\n';

 cout << "Модифицированные значения полей y.a и y.b: ";

 cout << y.a << ' ' << y.b << '\n';

 return 0;

}

// Функция, которая получает и возвращает ссылку на структуру.

mystruct &f(mystruct &var)

{

 var.a = var.a * var.a;

 var.b = var.b / var.b;

 return var;

}

Вот результаты выполнения этой программы.

Исходные значения полей x.a and x.b: 10 20

Модифицированные значения полей х.а и x.b: 100 1

Модифицированные значения полей у.а и y.b: 100 1

Ввиду существенных затрат системных ресурсов на передачу структуры функции (или при возвращении ее функцией) многие С++-программисты для выполнения таких задач используют ссылки на структуры.

Использование в качестве членов структур массивов и структур

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

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

struct stype {

 int nums[10][10]; // Целочисленный массив размерностью 10 х 10.

 float b;

} var;

Чтобы обратиться к элементу массива nums с "координатами" 3,7 в структуре var типа stype, следует записать такой код:

var.nums[3][7]

Как показано в этом примере, если массив является членом структуры, то для доступа к элементам этого массива индексируется имя массива, а не имя структуры.

Если некоторая структура является членом другой структуры, она называется вложенной структурой. В следующем примере структура addr вложена в структуру emp.

struct addr {

 char name[40];

 char street[40];

 char city[40];

 char zip[10];

}

struct emp {

 addr address;

 float wage;

} worker;

Здесь структура emp имеет два члена. Первым членом является структура типа addr, которая будет содержать адрес служащего. Вторым членом является переменная wage, которая хранит его оклад. При выполнении следующего фрагмента кода полю zip структуры address, которая является членом структуры worker, будет присвоен почтовый индекс 98765:

worker.address.zip = 98765;

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

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

struct mystruct {

 int а;

 char str[80];

 mystruct *sptr; // указатель на объекты типа mystruct

};

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

Сравнение С- и С++-структур

С++-структуры — потомки С-структур. Следовательно, любая С-структура также является действительной С++-структурой. Между ними, однако, существуют важные различия. Во-первых, как будет показано в следующей главе, С++-структуры имеют некоторые уникальные атрибуты, которые позволяют им поддерживать объектно-ориентированное программирование. Во-вторых, в языке С структура не определяет в действительности новый тип данных. Этим может "похвалиться" лишь С++-структура. Как вы уже знаете, определяя структуру в C++, вы определяете новый тип, который называется по имени этой структуры. Этот новый тип можно использовать для объявления переменных, определения значений, возвращаемых функциями, и т.п. Однако в С имя структуры называется ее тегом (или дескриптором). А тег сам по себе не является именем типа.

Чтобы понять это различие, рассмотрим следующий фрагмент С-кода.

struct C_struct {

 int а; int b;

}

// объявление переменной C_struct

struct C_struct svar;

Обратите внимание на то, что приведенное выше определение структуры в точности такое же, как в языке C++. Теперь внимательно рассмотрите объявление структурной переменной svar. Оно также начинается с ключевого слова struct. В языке С после определения структуры для полного задания типа данных все равно нужно использовать ключевое слово struct совместно с тегом этой структуры (в данном случае с идентификатором C_struct).

Если вам придется преобразовывать старые С-программы в код C++, не беспокойтесь о различиях между С- и С++-структурами, поскольку C++ по-прежнему принимает С-ориентированные объявления. Например, предыдущий фрагмент С-кода корректно скомпилируется как часть любой С++-программы. С точки зрения компилятора C++ в объявлении переменной svar всего лишь избыточно использовано ключевое слово struct, без которого в C++ можно обойтись.

Соседние файлы в папке lekcii_1_10