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

Как вы уже знаете, после названия функции, внутри круглых скобок, указывается тип и название параметров через запятую. Если функция не принимает параметров, то указываются только круглые скобки или внутри круглых скобок задается ключевое слово void (в языке C ключевое слово void является обязательным). В определении функции после типа обязательно должно быть указано название параметра, которое является локальной переменной. Эта переменная создается при вызове функции, а после выхода из функции она удаляется. Таким образом, локальная переменная видна только внутри функции и ее значение между вызовами не сохраняется (исключением являются статические переменные). Если название локальной переменной совпадает с названием глобальной переменной, то все операции будут производиться с локальной переменной, а значение глобальной не изменится. Чтобы в этом случае обратиться к глобальной переменной, необходимо перед ее названием указать оператор ::.

При вызове функции указывается название функции, после которого внутри круглых скобок передаются значения. Количество и тип параметров в объявлении функции должны совпадать с количеством и типом параметров при вызове. Переданные значения присваиваются переменным, расположенным в той же позиции в определении функции. Так при вызове функции sum(10, 20) (прототип int sum(int x, int y)) переменной x будет присвоено значение 10, а переменной y — значение 20. Если функция не принимает параметров, то при вызове указываются только круглые скобки.

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

Листинг 12.7. Передача параметра по значению

#include <iostream>

void func(int x);

int main() {
   int x = 10;
   func(x);
   std::cout << x << std::endl; // 10
   return 0;
}
void func(int x) {
   x = x + 20; // Значение нигде не сохраняется!
}

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

Листинг 12.8. Передача указателя в функцию

#include <iostream>

void func(int *px);

int main() {
   int x = 10;
   func(&x);                    // Передаем адрес
   std::cout << x << std::endl; // 30, а не 10
   return 0;
}
void func(int *px) {
   *px = *px + 20;    // Изменяется значение переменной x
}

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

Листинг 12.9. Использование механизма ссылок

#include <iostream>

void func(int &y);

int main() {
   int x = 10;
   func(x);
   std::cout << x << std::endl; // 30, а не 10
   return 0;
}
void func(int &y) {
   // Переменная y является псевдонимом переменной x
   y = y + 20; // Изменяется значение переменной x
}

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов