Алгоритм и структура данных. 1 Базовый процедурноориентированный алгоритмический язык
Скачать 1.16 Mb.
|
Перегрузка функцийПерегрузка функций — это возможность определять несколько функций с одним и тем же именем, но с разными параметрами. Например:
Здесь мы выполняем операцию вычитания с целыми числами. Однако, что, если нам нужно использовать числа типа с плавающей запятой? Эта функция совсем не подходит, так как любые параметры типа double будут конвертироваться в тип int, в результате чего будет теряться дробная часть значений. Одним из способов решения этой проблемы является определение двух функций с разными именами и параметрами:
Но есть и лучшее решение — перегрузка функции. Мы можем просто объявить еще одну функцию subtract(), которая принимает параметры типа double:
Теперь у нас есть две версии функции subtract():
Может показаться, что произойдет конфликт имен, но это не так. Компилятор может определить сам, какую версию subtract() следует вызывать на основе аргументов, используемых в вызове функции. Если параметрами будут переменные типа int, то C++ понимает, что мы хотим вызвать subtract(int, int). Если же мы предоставим два значения типа с плавающей запятой, то C++ поймет, что мы хотим вызвать subtract(double, double). Фактически, мы можем определить столько перегруженных функций subtract(), сколько хотим, до тех пор, пока каждая из них будет иметь свои (уникальные) параметры. Следовательно, можно определить функцию subtract() и с большим количеством параметров:
Хотя здесь subtract() имеет 3 параметра вместо 2, это не является ошибкой, поскольку эти параметры отличаются от параметров других версий subtract(). Типы возврата в перегрузке функцийОбратите внимание, тип возврата функции НЕ учитывается при перегрузке функции. Предположим, что вы хотите написать функцию, которая возвращает рандомное число, но вам нужна одна версия, которая возвращает значение типа int, и вторая — которая возвращает значение типа double. У вас может возникнуть соблазн сделать следующее:
Компилятор выдаст ошибку. Эти две функции имеют одинаковые параметры (точнее, они отсутствуют), и, следовательно, второй вызов функции getRandomValue() будет рассматриваться как ошибочное переопределение первого вызова. Имена функций нужно будет изменить. |