Помощь в написании студенческих работ
Антистрессовый сервис

Теоретическая часть. 
Моделирование поведения векторов в трехмерном евклидовом пространстве

РефератПомощь в написанииУзнать стоимостьмоей работы

Возврат больших объектов по ссылке дешевле, чем по значению. Если результат содержится в одном из операндов, то можно вернуть ссылку на этот операнд. Возврат по значению Если результат не содержится ни в одном из операндов, то приходится возвращать объект по значению (может быть по константному значению). Правило Если сомневаешься, как получать аргументы или возвращать значение — делай так, как… Читать ещё >

Теоретическая часть. Моделирование поведения векторов в трехмерном евклидовом пространстве (реферат, курсовая, диплом, контрольная)

Стандартные обозначения.

Предметная область определяет действия символов Алгебра: действительные числа a + b? c Умножение и сложение действительных чисел.

Аналитическая геометрия: вектора ~z = ~a? 0.6 + ~c Умножение вектора на скаляр и сложение векторов.

Программирование: строки s t ring s = «ABCDE», t = «ZZZ», x; s += «atu_example_string_x42»; / / конкатенация строк x = t + s; / / аналогично Реализация действий в C++

Стандартный поход: функции class Vect { public: Vect (double ax, double ay): x (ax), y (ay) {}; void addfrom (const Vect &r); friend Vect add (const Vect &l, const Vect &r); private: double x, double y; }; Vect a (1, 2), b (1, 1), c (0, 0); a. addfrom (b); c = add (a, b) ;

Достоинство подхода: используются привычная для программиста форма записи. Недостатки: непривычная форма записи для специалиста впредметной области, слишком длинная форма записи.

Функции-операторы

Вызов функций при использовании операторов. Решение проблемы в C++.

Действия в любом случае выполняют функции; функциям даются специальные имена, состоящие из слова «operator» и собственно символа оператора (например «+», «<

Ограничения

Какие функции-операторы определять нельзя

Пользовательские типы: Хотя бы один из операторов должен быть пользовательского типа. Нельзя определять действие оператора только для фундаментальных или производных типов.

Неизменность характеристик оператора: нельзя изменить приоритет, арность и ассоциативность оператора. Нельзя определять новые операторы. Запрещено перегружать операторы: :. .??: sizeof typeid throw static_cast dynamic_cast reinterpret_cast .

Способ реализации функции-оператора

Функция член класса

В предыдущем примере оператор «+=» был определен как функция-член, а оператор «+» — как функция не-член (друг). Как следует делать выбор? Если функция-оператор реализована как член класса, то ее вызов выглядит так: a. operator@ (b); / / binary a. operator@ (); / / unary В этом случае на первый (левый) операнд, так как он передается с помощью указателя this накладывается существенное ограничение: это должен быть объект, являющийся экземпляром данного класса. Для него не производятся неявные преобразования. Если такое ограничение — свойство самого оператора, то следует использовать функцию-член класса. Например, операторы «=», «&», «[]», «->» должны быть членами класса операторов .

Способ реализации функции-оператора

Функция не-член класса программа вектор трехмерный листинг Если операнды у оператора равноправны, то следует реализовывать функцию-оператор как не-член класса (как друга или помощника). При этом разрешены неявные преобразования как для первого, так и для второго аргумента. Бинарные операторы «+», «-», «*» и т. д. правильно определять как функции не-члены класса. Если уже определены операторы «+=», «-=», то можно использовать их функциональность и реализовать «+», «-», «*» как функции-помощники, не имеющие доступ к реализации. Если первый аргумент — объект не нашего типа, то функция не может быть реализована как функция-член класса. Например, многие классы определяют оператор «<

Унарный оператор

Передача параметров унарному оператору (1)

Унарный оператор — как функция член класса В этом случае у функции не должно быть явных аргументов — единственный операнд передается с помощью указателя this. Пример: class A { public: A& operator++(); / / p re fix: ++a const A operator++(int); / / pos t fix: a++ }; При этом следующие вызовы эквивалентны: A a; ++a; a. operator++(); Для определения постфиксных ++ и — следует передать фиктивный параметр типа int.

Унарный оператор Передача параметров унарному оператору (2) Унарный оператор — как функция не-член класса В этом случае у функции должен быть один явный аргумент — единственный операнд передается через него. Пример: class A { public: friend const A& operator+(const A& arg); }; При этом следующие вызовы эквивалентны: A a; +a; operator+(a) ;

Бинарный оператор Передача параметров бинарному оператору (1) Бинарный оператор — как функция член класса В этом случае у функции должен быть 1 явный аргумент — правый операнд передается через него, а левый — с помощью указателя this. Пример: class A { public: A& operator+=(const A& rhs); }; При этом следующие вызовы эквивалентны: A a. b; a+=b; a. operator+=(b) ;

Бинарный оператор Передача параметров бинарному оператору (2) Бинарный оператор — как функция не-член класса В этом случае у функции должно быть 2 явных аргумента — оба операнда передается явно. Пример: class A { public: friend const A operator+(const A& lhs, const A& rhs); }; При этом следующие вызовы эквивалентны: A a, b, c; c = a+b; c = operator+(a, b) ;

Автоматически создаваемые операторы Компилятор создаст сам, если не задал пользователь

Автоматически создаются функции для следующих операторов = Реализация: вызываются операторы «=» для всех вложенных и базовых объектов. & / / унарный; (+const) Реализация: возвращает адрес объекта. Правило Если объект захватывает ресурсы (память, файлы), то у него должен быть определен оператор присваивания (также как конструктор копирования и деструктор). Можно запретить присваивание, описав оператор в «private» и не дав его определения (C++11: «= delete»).

Передача аргументов По ссылке или по значению

Передача по ссылке (const T &arg)

Передача больших объектов по ссылке дешевле, чем по значению. Если оператор не должен изменять аргумент, то следует использовать ссылку на константный объект. Передача по значению (T arg) Если содержимое объекта мало (например один int или double), то имеет смысл передавать по значению.

Возврат значения По ссылке или по значению

Возврат по ссылке

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

Рекомендации по определению функций-операторов

Сначала определяйте операторы с присваиваниями (+=), а потом, с использованием уже созданного — соответствующие бинарные операторы (+). Оператор «=» (а также +=. -=,.. .) должен возвращать *this. Оператор «=» должен или проверять на равенство левого и правого оператора, или использовать swap-технологию. В операторе «=» помните про все члены данных. Не перегружайте &&, ||, «,» без особой необходимости. Осторожно используйте операторы преобразования.

Показать весь текст
Заполнить форму текущей работой