}
// Определение функции pow(), возвращающей степень первого параметра/
//
Второй параметр - значение степени.
double pow(double x, int n)
{
...
return retval;
}
// определение функции извлечения квадратного корня
double squareroot(double x)
{
...
return retval;
}
// определение функции print
void print()
{
cout << "hello world";
}
// Вызов функции
double x=sinus(0.1);
double y=pow(x,2);
print();
При передаче параметров можно использовать как их значение так и
ссылки или указатели. При передаче по значению фактический параметр,
существующий в вызывающем коде, копируется в формальный параметр.
Поэтому все иизменения параметров внутри
функции не отражаются в
вызывающей программе. При передаче по значению в прототипе функции
указаны типы параметров.
void f(A a)
// параметр можно назвать любым именем на свой вкус. Как его
//
назовете, так и придется к нему обращаться в теле функции.
//
Здесь 'A a' является определением локального для функции
//
объекта
{
a.x = -1.0;
}
A a{0,0};
f(a);
cout << a.x; // 0.0
При передаче по ссылке значения не копируются, в функцию передаются
ссылки на параметры. Следствием этого является возможность внутри функции
параметры изменить и увидеть эти изменения в том месте, откуда функция
была вызвана.
55
void f(A &a)
// передача 'a' по ссылке
{
a.x = -1.0;
}
A a{0,0};
f(a);
cout << a.x; // -1.0
При передаче указателя в функцию происходит
копирование значения
этого указателя, но не объекта, на который он указыает. Поэтому объект из
функции можно изменить, но при этом значение самого указателя - нет.
void f(A *pa)
// передача указателя 'pa'
{
pa->x = -1.0;
pa=nullptr;
// не имеет эффекта за пределами функции 'f'
}
A a{0,0};
f(&a);
// передача адреса 'a' в функцию. оператор '&' - взятие адреса объекта
cout << a.x; // -1.0
С функциями связан еще один тип данных - указатели на функции. Такие
указатели в отличие от указателей на данные указывают на
адрес функции в
памяти, содержащей код программмы. Указатели на функции, как правило,
используются для передачи в качестве параметра в другие функции и могут
быть полезны, если требуется динамическое
изменение выполнения
программы: в указателях можно передавать различные функции в зависимости
от обстоятельств. Например, в программу рисования графиков, при едином
алгоритме рисования можно в форме указателей на функцию передавать способ
расчета значений по шкале ординат.
Объявляются указатели на функции
как и указатели на данные с
помощью '*', хотя и несколько необычно:
double (*trigonometric)(double);
// объявление функции 'double
trigonometric(double);'
trigonometric = sin;
// Теперь указатель указывает на функцию 'sin'.
// 'sin
' объявляется в заголовке . Также можно
//
получить адрес с помощью операции взятия адреса:
// 'trigonometric = &sin
;'. Оба способа равнозначны.
В объявлении указателя на функцию указываются возвращаемое значение
и список параметров (в примере оба - 'double'), а также имя указателя -
'trigonometric'. Вызов осуществляется обычным образом:
double x={1.0}, y;
y = trigonometric(x); //
Вызов функции. Также функцию по указателю можно
//
вызвать вначале его разыменовав: (*trigonometric)(x)
cout << "sin(1.0)=" << y << endl;
56
cout << mod(a) << endl;
// использование глобальной функции
cout << smod(a) << endl; //
использование статической функции
cout << example_space::mod(a) << endl;
// использование функции из
//
пространства имен
}
При этом язык предоставляет возможность создания объектов-функций --
функторов, лямбда-функций и замыканий.
Do'stlaringiz bilan baham: