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, X2и A, но это никак не отразится на значениях аргументов, т. е. аргументы надежно защищены от непреднамеренного изменения формальных параметров внутри функции.
К недостаткам такой передачи параметров по значению относятся, во-первых, затраты времени на копирование значений и затраты памяти для хранения копии и, во-вторых, невозможность из функций изменять значения некоторых аргументов, что во многих случаях желательно. Действительно, рассмотрим классический пример по обмену значениями между двумя переменными.
Пример 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<<"Исходные значения переменных i и 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;
}
Результат
Исходные значения переменных i и j: 10 20
Значения переменных i и j после обмена: 10 20
В этом примере переменной iбыло присвоено начальное значение 10, а переменной j– 20. Затем была вызвана функция swap, в которую были переданы значения этих переменных. Как вы видите, никакого обмена не произошло, поскольку функция swap работает с копиями переменных i и j, поэтому фактические параметры не изменились.
Возможен и другой способ передачи параметров – вызов по ссылке. В случае вызова по ссылке в функцию передается адрес элемента.
Вызов по ссылке можно осуществить двумя способами: с помощью указателей и с помощью ссылочных параметров.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.