Информатика: Методические указания к лабораторным работам № 1-5. Функции. Обработка символьных данных. Организация работы с файлами, страница 2

3) voidwrite(void) // Ничего не возвращает, ничего не получает

{cout<<”\n НАЗВАНИЕ:”;} // Всегда печатает одно и то же

Здесь заголовок можно упростить voidwrite(). Тип возвращаемого значения должен быть указан явно, т. е. написание заголовка в виде write()было бы ошибкой.

Передача параметров в функции по значению и по ссылке

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

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

Согласование по типам между формальными и фактическими параметрами требует, чтобы до первого обращения к функции было помещено либо ее определение, либо ее объявление (прототип).Наличие прототипа позволяет компилятору выполнять контроль соответствия типов параметров.

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

double FSum(double X1, double X2, int A)

указано три формальных параметра X1, X2, Aи определены их типы. Обращение к такой функции может иметь вид:

double Z = FSum(Y, Y2,5);

Это только один из способов передачи параметров в функцию, называемый передачей по значению. Работает он так. В момент вызова функции в памяти создаются временные переменные с именами X1, X2, A, и в них копируются значения аргументов Y, Y2и константы 5. На этом связь между аргументами (фактическими параметрами) и переменными X1, X2, A (формальными параметрами)разрывается. Вы можете изменять внутри функции значения X1, XA, но это никак не отразится на значениях аргументов, т. е. аргументы надежно защищены от непреднамеренного изменения формальных параметров внутри функции.

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

Пример 1

#include <iostream>

#include <iomanip>

 using namespace std;

//Прототип функции swap. Передача параметров по значению

void swap(int x,int y);

void main ()

{

 setlocale(LC_ALL,"rus_rus.1251");

 int i,j;

i = 10;

 j = 20;

cout<<"Исходные значения переменных  и  j: "

<<i<<setw(5)<<j<<endl;

swap(i,j); //Вызов функции с адресами переменных  i  и  j

cout<<"Значения переменных  i  и  j  после обмена: "

<<i<<setw(5)<<j<<endl;

}

// Определение функции swap

void swap(int x,int y)

{ int temp;

 temp =x;

 x = y;

 y = temp;

}

Результат

Исходные значения переменных  и  j: 10 20

Значения переменных  i  и  j  после обмена: 10 20

В этом примере переменной  iбыло присвоено начальное значение 10, а переменной j– 20. Затем была вызвана функция swap, в которую были переданы значения этих переменных. Как вы видите, никакого обмена не произошло, поскольку функция swap работает с копиями переменных  i и  j,  поэтому фактические параметры не изменились.

Возможен и другой способ передачи параметров – вызов по ссылке. В случае вызова по ссылке в функцию передается адрес элемента.

Вызов по ссылке можно осуществить двумя способами: с помощью указателей и с помощью ссылочных параметров.