Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Перегрузка оператора вызова функции

Читайте также:
  1. III Непрерывность дифференцируемой функции
  2. III. Функции Бюро контрольных работ
  3. IV. Основные функции участников
  4. Автокорреляционная функция ЛЧМ-сигнала. Сечения функции неопределенности ЛЧМ-сигнала. Выбор класса зондирующих сигналов для РЛС.
  5. Асимптоты графика функции
  6. Аспекты структуры типа ИМ (функции)
  7. Б. Регенерация нервных волокон как фактор, способствующий восстановлению нарушенной функции.

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

<выражение> (<список_выражений>)

Здесь

<выражение> первый операнд;

<список_выражений> второй операнд (необязательный). Оператор вызова функции должен быть объявлен как нестатическая функция-член класса. К пере­грузке этого оператора прибегают в тех случаях, когда нужна операция, требующая многих параметров.

Когда оператор вызова функции перегружен, он модифицирует интерпретацию применения круглых скобок к объектам того класса, в котором он объявлен, а не то, как функции вызываются.

Рассмотрим пример, в котором перегрузка оператора вызова функции используется для вычисления вектора, повёрнутого относительно заданного вектора на заданный угол:

Файл DotVec.h
class Vec; // неполное объявление класса вектора

class Dot // класс точки

{

• • •
public:

Dot operator + (Vec & V); // перегрузка оператора сложения точки и вектора

};

class Vec // класс вектора

{

Объектно-ориентированное программирование

• • •
public:


Лекция 8 Перегрузка операторов *|3

Vec & operator () (Vec & V, int f); // перегрузка оператора вызова функции };

Файл DotVeccpp include "DotVech"

• • •

Vec & Vec:: operator () (Vec & V, int f ) // поворачивает вектор V на
{ // angle градусов по часовой стрелке

const double pi = 4 * atan (1); // объявляет константу пи

double F = f * pi / 180.0; // пересчитывает градусы в радианы

х = V.x * cos (F) - V.y * sin (F); у = V.x * sin (F) + V.y * cos (F);

return *this; // возвращает текущий объект

}

Файл Main.cpp include "DotVech" void main () {

Dot A ('A'), В ('В'), С ('С'); // объявляет точки

Vec AB ("АВ",+А,+В), АС ("АС"); // вводит координаты точек А и В с клавиатуры,

// объявляет вектора АВ и АС,

// конструирует вектор АВ по координатам его концов.
~ (С = А + ~АС (АВ, 60)); // поворачивает вектор АВ на 60° по часовой стрелке,

// инициализирует вектор АС повёрнутым вектором, // выводит проекции вектора АС на экран, // складывает точку А с вектором АС, // результат сложения передаёт в точку С, // выводит координаты точки С на экран. }

При выполнении программа выводит на экран: Введите координаты точки В х = 3

У = 1 Введите координаты точки А х = 1

У = 1
Проекции вектора АС х = 1 у = 1.73205

Координаты точки С х = 2 у = 2.73205

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

Не следует путать выражения, использующие круглые скобки: Vec АС ("АС") с АС (АВ, 60). Пер­вое вызывает конструктор с параметрами, второе - перегруженный оператор вызова функции.


Дата добавления: 2015-11-26; просмотров: 51 | Нарушение авторских прав



mybiblioteka.su - 2015-2024 год. (0.006 сек.)