Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы ОАиП.docx
Скачиваний:
137
Добавлен:
09.03.2016
Размер:
139.71 Кб
Скачать

50.Указатели как формальные параметры и как результат функций.

Формальные параметры – это переменные, которые объявляются в заголовке функции при ее определении. Список формальных параметров определяет: количество данных, которое должна получить или вернуть функция, типы этих данных и порядок следования данных. Фактические параметры (аргументы) функции указываются в круглых скобках при вызове функции после ее имени. Они задают конкретные данные, которые передаются в вызываемую функцию, или переменные, в которые вызываемая функция передает результаты своей работы.

В С++ существуют два способа передачи параметров в функцию:

  • по значению

  • по ссылке

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

Синтаксис формального параметразначения:

тип имя_параметра

Пример прототипа функции с формальным параметром значением:

float f(int x);

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

При передаче параметров функции по ссылке в формальный параметр функции передается не копия значения фактического параметра, а его адрес. Термин «ссылка» означает ссылку на область памяти. Функция, работая с формальным параметром, обращается по указанному в формальном параметре адресу и изменяет значение фактического параметра. Таким образом, формальные параметры-ссылки могут использоваться для получения из функции выходных данных (результатов работы функции).

Для реализации передачи по ссылке используются два способа:

  • связь через формальный параметр-указатель

  • связь через ссылочный формальный параметр

51.Ссылки как формальные параметры и как результат функций.

Передача по ссылке

При передаче по ссылке обеспечивается непосредственный доступ из тела функции к соответствующему аргументу. При вызове функции аргумент задается в виде переменной (без указания символа адреса &), а все обращения к параметру внутри функции разыменовываются неявно.

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

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

При этом параметр-ссылка обеспечивает те же самые возможности, что и параметр-указатель. Отличия состоят в том, что в теле функции для параметра-ссылки не нужно применять операцию разыменования *, а фактическим параметром должен быть не адрес переменной (как для параметра-указателя), а ее значение (она сама).

Пример демонстрирует особенности передачи параметров в функцию через ссылки по сравнению с передачей параметров через указатели: void changePtr (double *a, double *b) {double c=*a; *a=*b; *b=c;}// функция меняет значения формальных параметров через ссылки void changeRef (double& x, double& y) 9{double z=x; x=y; y=z;} void main() {double d=1.23; double e =4.56; changePtr(&d, &e) ; cout << "\nd= " << d << "\t\te=" << e ; changeRef(d, e) ; cout << "\nd= " << d << "\t\te=" << e ; cout << endl; _getch(); return; }

Пример функции, возвращающей ссылку как результат своей работы:

int x;// глобальная переменная int& setx();// прототип функции int main(){ setx() = 92;// функция вызывается из левой части оператора присваивания cout << "x=" << x << endl;// вывод нового значения глобальной переменной _getch(); return 0;} //-------------------------------------------------------------- int& setx(){ return x;// возвращает ссылку на х }