Здавалка
Главная | Обратная связь

Ссылки в качестве результатов функций



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

Для функции, объявленной как

double &ref(double d);

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

Листинг 1.17 демонстрирует использование ссылочных функций для скрытия внутреннего представления структуры данных. Это используется при реализации больших проектов, особенно когда структуры данных могут изменяться, что, в свою очередь, может послужить причиной коренной переделки программ, написан­ных на обычном С. Ссылочные функции в С++ могут облегчить этот рутинный процесс, обеспечив дос­туп к структурам данных, подобным массивам, без привязки кода к физическим свойствам данных. Скомпи­лируйте и запустите программу, по приглашению введите индексное значение от 0 до 9, затем — вещественное значение. Для завершения работы программы нажмите по приглашению <Enter>.

Листинг 1.17. REFFUNC.CPP (ссылочные функции)

1: #include <iostream.h>

2: #include <stdlib.h>

3: #include <string.h>

4:

5: #define FALSE 0

6: #define TRUE 1

7: #define SIZE 10

8: #define BUFLEN 20

9:

10: double &ref(int index);

11: void ShowArray(void);
12:

13: double array[SIZE];
14:

15: main()

16: {

17: int done = FALSE, index;

18: char buffer[BUFLEN];
19:

20: for (index = 0; index < SIZE; index++)
21: ref(index) = index; // Присваивание ссылочной функции!

22: while (!done) {

23: ShowArray();

24: cout « "\nEnter index from 0 to 9, Enter to quit:";

25: cin.getline(buffer, BUFLEN);

26: done = (strlen(buffer) == 0);

27: if (!done) {
28: index = atoi(buffer);

29: cout << "Enter floating-point value:";

30: cin.getline(buffer, BUFLEN);
31: ref(index) = atof(buffer);
32: }
33: }

34: return 0;

35: }

37: double &ref(int index)

38: {

39: if ((index < 0) || (index >= SIZE))

40: index = 0;

41: return array[index]; // Вернуть ссылку на элемент массива

42: }

43:

44: void ShowArray(void)

45: {

46: cout << "\nArray:\n";

47: for (int i = 0; i < SIZE; i++)

48: cout << "[" << i << "] == " << array[i] << '\n';

49: }

Глобальный массив вещественных значений двойной точности объявляется в строке 13. В больших по раз­мерам программах он может находиться в отдельном модуле. Хотя программа отображает значения и вставля­ет их в этот массив, это происходит без непосредственных ссылок на глобальную структуру данных в функ­ции main(). Благодаря ссылочным функциям можно изменить внутреннее содержимое вещественных значений двойной точности (возможно, используя связный список вместо массива), и программа останется рабочей без малейших изменений в функции main()..

В строке 10 объявляется ссылочная функция с именем ref(). Она возвращает ссылку на вещественный объ­ект двойной точности, идентифицированный целочисленным параметром-индексом. Поскольку функция воз­вращает ссылку на вещественный объект двойной точности, имя функции может оказаться слева от оператора присваивания, как показано в строке 21. Вероятно, это самое частое употребление ссылочных функций. Опе­ратор в строке 21 присваивает значение вещественному объекту двойной точности, на который ссылается ref(index). Конкретное внутреннее представление этого объекта несущественно. Ссылочная функция скрывает внутреннее представление данных.

В строке 31 приводится еще один способ использования ссылочных функций. Вещественный результат двойной точности из функции atof() присваивается функции ref(index). Если ref — массив, этот оператор мо­жет быть написан так:

ref[index] = atof(buffer);

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

Ссылочная функция приводится в строках 37-42. Оператор if обеспечивает значения индекса в области до­пустимых значений, после чего оператор return в строке 41 возвращает ссылку на одно из вещественных значений двойной точности в глобальном массиве. Важно разобраться, что в строке 41 не возвращается веще­ственное значение двойной точности. Возвращается ссылка на объект этого типа. Если бы ref() возвращала ве­щественное значение двойной точности, то она не могла бы использоваться в левой части оператора присваи­вания, как это произошло в main().







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.