
- •Обратите внимание, что для тела if и else if не стоит скобочек. Скобочки ветвлений можно опускать, если в теле ветвления всего один оператор.
- •Объявления функций (прототипы)
- •Локальные переменные
- •Статические локальные переменные
- •Передача аргументов по значению (pass-by-value)
- •Передача аргументо по ссылке (pass-by-reference)
- •Передача аргументов по указателю (pass-by-pointer)
- •Перегруженные функции
- •Константные аргументы функции
- •Встраиваемые функции (inline functions)
- •Заключение
Передача аргументо по ссылке (pass-by-reference)
Ссылка на переменную - это другое имя той же переменной. Т.е. это как псевдоним.
Передача по ссылке (pass-by-reference) позволяет изменять значение переменной из внешнего окружения внутри функции.
int simple_function(int&); // прототип ф-ии
int main ()
{
int x = 4; // переменная x в вызывающем окружении
int y;
y = simple_function(x); // присваивание переменной y возвращаемого значения функции
cout << x; // 9
return 0;
}
int simple_function(int& z) // переменная z в функции
{
z = z + 5;
return z;
}
Для передачи по ссылке, после имени типа в обьявлении и определении нужно поставить амперсанд. Больше никаких изменений делать не нужно. Я только изменил имя переменной внутри функции для наглядности.
x и z - одна и та же переменная. При обращении к одной из этих переменных мы обращаемся к одному участку памяти. При передаче аргумента по ссылке не происходит копирования. Просто для участка памяти, где содержится значение, создаётся ещё одно имя - z. Поэтому после вызова функции, у переменной x - новое значение 9.
Через оператор return можно вернуть только одно значение. Передача по ссылке нужна, когда необходимо вернуть несколько значений. Нужно просто передать необходимое количество аргументов и внутри функции произвести над ними необходимые операции. При этом можно вообще ничего не возвращать (использовать тип void). Посмотрите на пример для наглядности:
void simple_function (int&, int&, int&);
int main ()
{
int a = 0;
int b = 2;
int c = 7;
simple_function (a, b, c);
cout << a; // 1
cout << b; // 4
cout << c; // 10
return 0;
}
void simple_function (int& x, int& y, int& z)
{
x = x + 1;
y = y + 2;
z = z + 3;
}
Передача аргументов по указателю (pass-by-pointer)
Обычно в учебниках указатели обьясняют довольно рано и уделяют этой теме немного внимания. Я не буду сейчас объяснять эту тему подробно, потому как она очень сложная и у нас пока нет необходимости использования указателей в программах. Указатели мы рассмотрим после классов и рассмотрим очень подробно т.к. они - одно из ключевых понятий в программировании. В данном уроке заострю внимание только на одном аспекте.
Массивы всегда передаются в функции через указатели:
void simple_function (int a[]); // прототип
int array[5];
simple_function(array); // передача массива в функцию
При передаче значения по указателю не происходит копирования значений. Отличие же от ссылки в том, что указатель - это не другое имя переменной, указатель - это адрес в памяти по которому можно найти значение переменной. Пока что не обращайте внимания на эти тонкости. Просто запомните, что при передаче массива в функцию, мы используем указатели. Имя массива - это и есть переменная-указатель, но если после идентификатора стоят квадратные скобки с индексом, то происходит обращение к конкретному элементу массива:
int array[5];
a = array; // указатель
a = array[0]; // не указатель
Перегруженные функции
Очень часто возникает ситуация, когда несколько функций выполняют одинаковые действия, только над разными типами. В данном случае можно использовать перегруженные функции.
Перегруженные функции - это функции с одним именем, но с разными типами аргументов:
int simple_function (float a, float b);
int simple_function (int a, int b);
int simple_function (int a);
Здесь представлено три объявления перегруженной функции simple_function. Для каждого варианта функции, нужно написать своё определение.
Перегруженные функции могут отличаться не только типами аргументов, но и их количевством (сравните 2-е и 3-е объявления).
И ещё один важный момент: в перегруженных функциях учитываются только аргументы, возвращаемое значение не играет никакой роли. В следующем примере, компилятор выдаст ошибку:
int simple_function (int a);
float simple_function (int a);