Введите координаты точки 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 <имя_нового_типа> ( ) ;
Функции преобразования подчиняются следующим правилам:
ü функция преобразования не имеет параметров;
ü в функциях преобразования типа не задается тип возвращаемого значения;
ü функция преобразования типа возвращает тип, указанный после ключевого слова operator;
ü функция преобразования типа может быть вызвана неявно;
ü функция преобразования типа наследуется.
В следующем примере функции преобразования вектора в число используется для вычисления длины вектора:
Файл 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 << S << "N =\t" << ( double ) N << '\n' ;// явный вызов функции преобразования вектора в число
~ ( W = N * 2.0 ) ;// вычисляет вектор W, длина которого равна 2,
// выводит на экран проекции вектора W.
cout << S << "W =\t" << ( double ) W << '\n' ;
}
В приведённом примере решена задача вычисления вектора заданной длины. Для этого мы сначала нормируем вектор – делим вектор на его длину, а затем умножаем на заданное число. Функция преобразования вектора в число в нашей программе используется в двух разных формах.
Выражение cout << ( double ) N << '\n'содержит явный вызов функции преобразования вектора в число и используется для вывода на экран длины вектора.
Выражение ~ ( 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