Выбрать главу

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

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

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

#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, т.е. на объявляемую здесь структуру.