Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования Сpp 25.09.11 (2).doc
Скачиваний:
16
Добавлен:
19.08.2019
Размер:
10.09 Mб
Скачать

2.1. Передача параметров

Как отмечалось, при вызове функции вместо ее формальных параметров из определения функции подставляются значения аргументов. Строго говоря, сначала создаются копии аргументов, а уже потом подставляются их значения. Такая передача аргументов называется механизмом передачи параметров по значению. Передача по значению удобна тем, что сделав копию программа может как угодно изменять ее, т.е. работая с формальным параметром программа не влияет на оригинал аргумента. Однако, передача по значению не всегда хороша. Дело вот в чем. Когда аргументов немного, и все они представляют собой базовые типы, то передача по значению удобна. В дальнейшем кроме базовых типов мы будем создавать типы, которые занимают довольно большие объемы памяти. Создание копий таких типов приведет к дополнительным затратам памяти и времени. Поэтому кроме передачи по значению в С++ предусмотрен так называемый механизм передачи по ссылке. Передача по ссылке означает, что программа обращается непосредственно к аргументу, точнее к первому байту участка памяти в котором записан аргумент.

Чтобы компилятор мог отличить способ передачи параметра, необходимо как-то, особым образом, выделить способ передачи по ссылке. Для этого используется знак амперсанда "&", который располагается после имени формального параметра передаваемого по ссылке, как в прототипе функции, так и в заголовке ее определения. Например,

void summa (int& x, int& y);

В качестве более серьезного примера рассмотрим программу пересчета длины заданной в дюймах в метрическую систему, исходя из равенства 1дюйм=0,0254 м.

//Программа, демонстрирующая передачу по ссылке

#include <iostream>

using namespace std;

/*далее идут прототипы трех функций

void getLength(double&); //ввод длины в дюймах

void translate(double&); //перевод в метры

void print(double&); // вывод на экран

void main()

{

double x=0; /*определяем переменную к адресу которой

будем обращаться в дальнейшем,

присваиваем ей начальное значение */

while (x>=0) //организуем бесконечный цикл

{

getLength(x); /* вводим значение в ячейку с адресом

по которому хранится переменная x */

translate(x); /* пересчитываем величину длины из

дюймов в метры */

print(x); /*вывод на экран переменной расположенной

по адресу */

}

}

/*далее идут определения функций

void getLength(double& y)

{

cout<<"Length inch=";

cin>>y;

}

void translate(double& z)

{

z=0.0254*z;

}

void print(double& u)

{

cout<<"Length meter="<<u<<endl;

}

Компилятор отведет переменной x ячейку памяти с неизвестным нам адресом. Но сам компилятор знает его и в дальнейшем использует его при обращении к функциям.

Иногда функции нужно передать массив, да и сама функция может возвратить массив. Примером является функция для умножени квадратной матрицы на вектор.

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

#include<iostream.h>

#include<iomanip.h>

#include<windows.h>

//-------------------------

void modify_array(int [], int);

void modify_element(int);

//--------------------------

void main(){

SetConsoleOutputCP(1251);

const int size=5;

int a[size]={0,1,2,3,4};

cout<<"Результаты передачи всего массива по ссылке"<<endl<<endl

<<"значения исходного массива"<<endl;

for(int i=0; i<size;i++)

cout<<setw(3)<<a[i]<<endl;

modify_array(a,size);

cout<<"Значения модифицированного массива:"<<endl;

for(int i=0; i<size; i++)

cout<<setw(3)<<a[i];

cout<<endl<<endl<<endl;

cout<<"Результаты передачи элемента массива по значению: "

<<endl<<endl<<"a[3]="<<a[3]<<endl;

modify_element(a[3]);

cout<<"a[3]="<<a[3]<<endl;

char z;

cin>>z;

}

void modify_array(int b[], int d){

for(int j=0; j<d; j++)

b[j]*=2;

}

void modify_element(int e){

cout<<"Значение в modify_element равно: "<<(e*=2)<<endl;

}