Изучая основы программирования по работе с функциями, не всегда просто понять, как правильно вызывать функцию. Тем не менее, все очень просто, попробуем в этом разобраться.
1. Чтобы вызвать функцию вам нужно знать только ее прототип. Прототип – это заголовок функции вместе с формальными параметрами.
Примеры:
int Grow(int a, float* c);
int Carrage(int* cr);
void SetVal(int &s);
2. Прототип функции дает нам всю необходимую информацию для вызова функции:
функция Grow требует первый параметр типа int, второй - указатель на тип float.
функция Carrage требует один параметр - указатель на тип int.
функция SetVal требует один параметр – ссылку на переменную типа int.
3. Теперь нужно определить какие переменные у нас есть в том месте, где мы хотели бы осуществить вызов этих функций. Допустим, мы будем вызывать их из главной программы, в которой у нас объявлены следующие переменные:
Int main()
{
int x, d, t[10];
float z, arr[20];
int *pVi;
float *pVf;
…
}
4. Последний шаг – это дать функции те типы значений, которые она хочет получить.
функция Grow требует первый параметр типа int, второй -указатель на тип float.
|
|
Правильные варианты фактических параметров:
Grow(x, pVf);
Grow(10, &z);
Grow(t[0], arr);
Кроме этого функция возвращает результат типа int в своем имени. Вы можете его использовать, если хотите:
d = Grow(x, pVf);
cout<<Grow(10, &z);
x = x + Grow(t[0], arr);
Неправильные варианты вызовов:
Grow(pVf, x); // порядок параметров нарушен: 1й – параметр не int, 2й – не float*
Grow(10); // функция требует 2 параметра, а не один
Grow(t, arr); // имя массива – это указатель на тип int, нужно значение типа int
z = Grow(x, pVf); // возвращаемое значение типа int, но z – типа float
Прототип функции не всегда позволяет точно определить входные и выходные параметры. Если имя функции имеет тип, отличный от void, то можно точно сказать, что функция возвращает как минимум одно значение. Например:
int Carrage(int* cr);
Однако в данном случае нельзя однозначно сказать, чем является формальный параметр cr – входным или выходным значением. Такой механизм может быть использован как для передачи массива, так и для передачи адреса простой переменной типа int. Поэтому для определения назначения формальных параметров необходимо либо изучить тело функции, либо воспользоваться справкой (если функция является стандартной).
2.7. Задача. Все функции с помощью различных механизмов (передача по значению, по ссылке, по адресу) получают на вход целочисленное значение и возводят его в квадрат. Укажите формат вызова этих функций:
a) при использовании целочисленной переменной (столбец 3)
b) при использовании указателя на целочисленную переменную (столбец 4)
Прототип функции | Обращение к значению num внутри функции | Вызов функции | |
int val | int* ptr | ||
void squareVal(int num) | num | squareVal() | squareVal() |
void squarePointer(int *num) | *num | squarePointer() | squarePointer() |
void squareReference(int &num) | num | squareReference() | squareReference() |
void squarePointerReference(int* &num) | *num | - | squarePointerReference() |
#include <iostream>
|
|
#include <stdlib.h>
using std::cout;
using std::endl;