Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Параметры функции






Механизм параметров является основным способом обмена информацией между вызываемой и вызывающей функциями.

Параметры, перечисленные в заголовке описания функции, называются формальными параметрами, или просто параметрами, а записанные в операторе вызова функции – фактическими параметрами, или аргументами.

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

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

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

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

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

 

#include " stdafx.h"

#include < iostream>

 

using namespace std;

 

void f(int a, int* b, int& c)

{

a++;

(*b)++;

c++;

}

 

void main()

{

 

int a = 1, b = 1, c = 1;

cout < < " a b c" < < endl;

cout < < a < < ' ' < < b < < ' ' < < c < < endl;

 

f(a, & b, c);

 

cout < < a < < ' ' < < b < < ' ' < < c < < endl;

return;

}

 

Результат работы программы:

 

a b c

1 1 1

1 2 2

 

Первый параметр (a) передается по значению. Его изменение в функции не влияет на исходное значение. Второй параметр (b) передается по адресу с помощью указателя, при этом для передачи в функцию адреса фактического параметра используется операция взятия адреса, а для получения его значения в функции требуется операция разыменования. Третий параметр (c) передается по адресу с помощью ссылки.

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

Если требуется изменить значение параметра внутри функции, то он передается, либо через ссылку, либо через указатель.

Если требуется запретить изменение параметра внутри функции, используется модификатор const:

int f(const char *);

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

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

 

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

Рассмотрим пример из предыдущей лабораторной работы, оформив вычисление значения в виде функции:

Составить программу вычисления значения функции

 

#include " stdafx.h"

#include < iostream>

#include < iomanip>

#include < math.h>

 

using namespace std;

 

float ax(float a, float x, float eps = 0.001f)

{

 

float xn = 1, y, y0;

 

unsigned int n = 1, nf = 1;

 

y = 1;

 

do

{

nf *= n;

xn *= x*log(a);

y0 = y;

y += xn/nf;

n++;

}

while (abs(y - y0) > eps);

 

return y;

}

 

void main()

{

setlocale(LC_ALL, " Russian");

 

const float eps = 0.1f;

 

float a, x, y;

 

cout < < " Введите a, x: " < < endl;

cin > > a > > x;

 

//передаем значение точности вычислений при вызове

y = ax(a, x, eps);

 

cout < < \

" Результат вычисления с точностью 0.1 (передается явно): " \

< < setw(8) < < setprecision(5) < < y < < endl;

 

//значение esp опускается

//внутри функции используется значение точности вычислений по умолчанию

y = ax(a, x);

 

cout < < \

" Результат вычисления с точностью 0.001 (по умолчанию): " \

< < setw(8) < < setprecision(5) < < y < < endl;

 

//вычисляем при помощи стандартных функций

y = pow(a, x);

 

cout < < \

" Результат вычисления с использованием стандартных функций: " \

< < setw(8) < < setprecision(5) < < y < < endl;

 

}

 

 

Результат выполнения:

 

Введите a, x:

2.5

Результат вычисления с точностью 0.1 (передается явно): 15.591

Результат вычисления с точностью 0.001 (по умолчанию): 15.625

Результат вычисления с использованием стандартных функций: 15.625

 

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.012 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал