- •7.1. Два подхода к передаче аргументов
- •1. Пример передачи аргументов по значению
- •2. Пример передачи аргументов по ссылке
- •3. Пример передачи аргументов по ссылке и по значению одновременно
- •7.2. Перегрузка функций
- •1. Программный пример перегрузки функций
- •2. Программный пример перегрузки функций
- •3. Программный пример перегрузки функций
- •7.3. Шаблоны функций
- •7.3.1. Родовые функции
- •7.3.2. Функция с двумя родовыми типами
- •7.4. Рекурсия
2. Пример передачи аргументов по ссылке
Для того чтобы аргумент передавался не по значению, а по ссылке, перед именем соответствующего аргумента необходимо указать оператор &. В листинге 7.2 приведен практически тот же программный код, что и в листинге 7.1, однако аргумент функции incr () в этом случае передается по ссылке.
Листинг 7.2. Передача аргумента по ссылке
// demoRef.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
//Аргумент передается по ссылке:
int incr (int &m);
int main()
{
int n=5;
cout << "n =" << incr (n) << endl;
cout << "n =" << n << endl;
cin >> n;
return 0;
}
int incr (int &m)
{
m=m+1;
return m;
}
3. Пример передачи аргументов по ссылке и по значению одновременно
Если у функции несколько аргументов, часть из них (или все) могут передаваться по ссылке, а часть - по значению. Пример приведен в листинге 7.3.
Листинг 7.3. Передача аргумента по ссылке и по значению
// demoVarRef.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
//Прототип функции
//Аргумент передается по ссылке и по значению:
void change(int &m, int n);
int main()
{
int m = 3, n = 5;
change(m,n);
cout << "m = " << m << endl;
cout << "n = " << n << endl;
cin >> n;
return 0;
}
//Определение функции
//Аргумент передается по ссылке и по значению:
void change(int &m, int n)
{
int k;
k=n;
n=m;
m=k;
cout << "m = " << m << endl;
cout << "n = " << n << endl;
}
В результате выполнения программы на экране появятся следующие строки:
m =5
n =3
m =5
n =5
У функции change () два целочисленных аргумента: первый передается по ссылке, а второй передается по значению. Действие функции состоит в том, что значения аргументов меняются местами: первому аргументу присваивается значение второго аргумента и наоборот. Но поскольку по ссылке передается только первый аргумент, то изменяется значение только этого аргумента - второй остается неизменным.
Обращаем внимание читателя на то, что наличие оператора & перед именем аргумента - всего лишь инструкция для определения механизма передачи аргумента. Это не влияет на способ обращения к аргументу или использования аргумента в теле функции.
7.2. Перегрузка функций
В С++ две или даже несколько функций могут иметь одно и то же имя при условии, что различаются объявления их параметров. Такие функции называются перегруженными, а само это средство называют перегрузкой функций. Перегрузка функций является одним из способов реализации полиморфизма в С++.
Для того, чтобы перегрузить функцию, достаточно объявить другой вариант функции с тем же именем. Компилятор возьмет на себя все остальное. Вы только должны соблюсти одно важное условие: типы или число параметров (или и то, и другое) каждой из перегруженных функций должны различаться. Для перегруженных функций недостаточно различия только в типе возвращаемых значений. Они должны различаться типом или числом их параметров. Разумеется, перегруженные функции могут различаться также и типами возвращаемых значений. Когда вызывается перегруженная функция, реально выполняется тот вариант, у которого параметры соответствуют аргументам вызова.
