Ссылки в качестве результатов функций⇐ ПредыдущаяСтр 13 из 13
Функции могут возвращать ссылки на объекты при условии, что эти объекты существуют, когда функция неактивна. (Другими словами, функции не могут возвращать ссылки на локальные автоматические переменные). Для функции, объявленной как 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); 13: double array[SIZE]; 15: main() 16: { 17: int done = FALSE, index; 18: char buffer[BUFLEN]; 20: for (index = 0; index < SIZE; 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) { 29: cout << "Enter floating-point value:"; 30: cin.getline(buffer, BUFLEN); 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 Все права принадлежат авторам размещенных материалов.
|