Введите координаты точки a. проекции вектора ac x = 1 y = 1.73205

      Комментарии к записи Введите координаты точки a. проекции вектора ac x = 1 y = 1.73205 отключены

x = 1

y = 1

Проекции вектора AC x = 1 y = 1.73205

Координаты точки C x = 2 y = 2.73205

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

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

Функции преобразования типа

Часто встречается задача преобразования объекта одного типа в объект другого типа. Мы уже рассмотрели ранее возможность такого преобразования с помощью конструкторов. Однако конструкторы преобразования имеют одно существенное ограничение: они позволяют преобразовать встроенный тип данных в объект, но не наоборот. Функции преобразования типа предоставляют возможность обратного преобразования объекта некоторого класса к любому из встроенных типов. Они имеют следующий вид:

operator( ) ;

Функции преобразования подчиняются следующим правилам:

u функция преобразования не имеет параметров;

u в функциях преобразования типа не задается тип возвращаемого значения;

u функция преобразования типа возвращает тип, указанный после ключевого слова operator;

u функция преобразования типа может быть вызвана неявно;

u функция преобразования типа наследуется.

В следующем примере функции преобразования вектора в число используется для вычисления длины вектора:

Файл Vec.h

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

{

• • •

public:

Vec operator * ( double m ) ;// перегрузка оператора умножения вектора на число

Vec operator / (double d) ;// перегрузка оператора деления вектора на число

operator double ( ) ;// функция преобразования вектора в число

};

Файл Vec.cpp

#include Vec.h

• • •

Vec Vec :: operator * ( double m )// перегрузка оператора умножения вектора на число

{

Vec T (T, x * m , y * m ) ;// объявляет и инициализирует временный объект

return T ;// возвращает временный объект

}

Vec Vec::operator / ( double d )// перегрузка оператора умножения вектора на число

{

Vec T (T, x / d , y / d ) ;// объявляет и инициализирует временный объект

return T ;// возвращает временный объект

}

Vec::operator double ( )// функция преобразования вектора в число

{

return sqrt ( x*x + y*y ) ;// возвращает длину текущего вектора

}

Файл Main.cpp

#include Vec.h

Void main ( )

{

char S [ ] = Длина вектора;

CharToOem ( S , S ) ;

Vec V (V, 1 , 1 ) ,W (W) , N (N) ;// объявляет вектора

~ ( N = V / V ) ;// неявный вызов функции преобразования вектора в число,

// вычисляет нормированный вектор,

// выводит на экран проекции нормированного вектора.

cout

~ ( W = N * 2.0 ) ;// вычисляет вектор W, длина которого равна 2,

// выводит на экран проекции вектора W.

cout

}

В приведённом примере решена задача вычисления вектора заданной длины. Для этого мы сначала нормируем вектор – делим вектор на его длину, а затем умножаем на заданное число. Функция преобразования вектора в число в нашей программе используется в двух разных формах.

Выражение cout

Выражение ~ ( N = V / V )содержит операцию деления вектора на вектор, которая нами не определена. Поэтому компилятор ищет самый “подходящий” перегруженный оператор. Таким оператором в классе Vecоказывается перегруженный оператор деления вектора на число. Поскольку в классе Vecопределена функция преобразования вектора в число, которая может быть вызвана неявно, то у компилятора появляется возможность однозначно трактовать выражение V / Vкак V / ( double ) V.

При выполнении программа выводит на экран:

Проекции вектора N x = 0.707107 y = 0.707107

Длина вектора N = 1

Проекции вектора W x = 1.41421 y = 1.41421

Длина вектора W = 2

Статьи к прочтению:

Leap Motion SDK


Похожие статьи: