Основы программирования на C++, PASCAL
В следующей программе определяется перегруженная функция modul() класса absolute, которая возвращает абсолютное значение как целочисленного, так и вещественного аргумента. В первом случае для этого используется библиотечная функция abs(), принимающая аргумент типа int, во втором случае — fabs(), принимающая аргумент типа double.
В результате работы программы получим:
Абсолютное значение числа —765 равно 765
Абсолютное значение числа —23.987 равно 23.987
Перегрузка операций. Полиморфизм в Си++ реализуется не только через механизм перегрузки функций, но и через перегрузку операций. Применительно к объектам определенного класса могут быть определены специфические правила выполнения некоторой операции. При этом сохраняется возможность ее традиционного применения в другом контексте.
Для перегрузки операции применительно к классу в число членов класса должна быть включена специальная функция операции, которая определяет действия, выполняемые по этой операции. формат определения функции-операции:
тип возвращаемого_значения operator знак_операции (спецификации_параметров операции) {тело_функции-операции}
Рассмотрим пример программы, в которой используются перегруженные операции.
Пример 5. Класс vector определяет трехмерный вектор в евклидовом пространстве. В этом классе будут использоваться перегруженные операции сложения (+) и присваивания (=) как операции с трехмерными векторами. Сумма двух векторов вычисляется как вектор, компоненты которого равны суммам соответствующих компонент слагаемых. Операция = выполняет покомпонентное присваивание векторов.
В результате выполнения программы на экране получим:
Здесь естествен вопрос: почему бинарные операции-функции + и = имеют в описании только по одному аргументу? Дело в том, что другой аргумент всегда передается неявно с использованием this-указателя. Оператор temp.x=x+t.x; аналогичен строке temp. x=this->x+t. х, т. е. х ссылается на this->x. Здесь this ассоциируется с объектом, предшествующим знаку операции. Объект справа от знака операции передается как параметр функции.
Если аналогичным образом определять унарные операции как функции-члены класса, то для них не требуется указания параметра. Объект, к которому относится операция, передается в функцию неявно через указатель this. Например, для класса vector можно добавить объявление унарной постфиксной операции ++: