АРХИВ ЗАПИСЕЙ  ●  УЧИМ C++

Рассмотрим программу, предназначенную для обработки полиномиальных выражений. Поскольку полином (как функциональная зависимость) однозначно определяется набором коэффициентов, его разумно реализовать в виде класса с полем-массивом числовых значений. Эти числовые значения отождествим с коэффициентами полинома.

Под вектор-функцией в данном случае подразумеваем функцию, которая в качестве результата возвращает массив значений. Для определения вектор-функции создадим специальный класс, в котором перегрузим ряд операторов (в первую очередь оператор [ ] ), чтобы формально результат вызова функции можно было индекси­ровать. Для простоты рас­смотрим ситуацию, когда вектор-функция описывает некоторую простран­ственную силу в трехмерном декартовом пространстве.

Путем перегрузки базовых операторов существенно упрощается процесс работы с такими математическими структурами, как матрицы. Здесь создадим специальный программный код, в котором предусмотрим возможность выполнять некоторые наиболее простые операции с матрицами, а именно складывать матрицы и умножать их. Более точно, решим следующие зада­чи.

Решим задачу о вычислении скалярного и векторного произведения двух векторов, для чего определим специальный класс и перегрузим ряд опера­торов.

Оператор [ ] (квадратные скобки) может перегружаться так же, как и рас­ смотренные выше арифметические операторы. Здесь рассмотрим при­ мер, в котором посредством перегрузки оператора [ ] решается задача по индексированию объектов. В частности, в программе описывается класс с полем-целочисленным массивом.

Как известно, если объекты принадлежат одному классу, к ним можно при­ менять операцию копирования. В этом случае по умолчанию выполняется побитовое копирование: объект, указанный слева от оператора присваивания "=" получает значения полей объекта, указанного справа от оператора присва­ивания. Хотя в большинстве случаев такая ситуация вполне приемлема, все же нередко приходится переопределять процедуру копирования объектов. Реализуется это посредством перегрузки оператора присваивания.

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

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

В примере приведен код программы, в которой использованы операторные функции для переопределения операций сложения, вычитания, инкремента, декремента и расчета комплексно-сопряженного числа.

В программе можно складывать не только числа (например, типов double, float или int), существует возможность вычислять сумму объектов класса MComp, который создавался как прототип комплексного числа. Тем не менее, хотя операция сложения действительного и комплексного числа с математической точки зрения является вполне естественной и четко определенной, при попытке сложить, например, пере­менную типа double и объект класса MComp возникнет ошибка, обуслов­ленная тем, что операция сложения объектов таких типов не определена.

1 2 3 ... 23 24 »
Онлайн всего: 12
Гостей: 12
Пользователей: 0

STUDLAB Сообщить про опечатку на сайте