Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП Лекции PDF / ООП 08 Лек Перегрузка операторов.pdf
Скачиваний:
72
Добавлен:
15.02.2015
Размер:
403.59 Кб
Скачать

Лекция 8

Перегрузка операторов

7

class Dot

Файл Dot.h

 

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

 

{

 

 

• • •

public:

friend Dot operator * ( double m , Dot & D ) ; // перегрузка оператора умножения числа на точку

} ;

Файл Dot.cpp

#include ”Dot.h”

// реализация перегруженного оператора умножения числа на точку

Dot operator * ( double m , Dot & D)

{

Dot T ( 'T' , D.x*m , D.y*m ) ; return T ;

}

Перегрузка операторов X=

В C++ существует несколько операторов, которые выполняют некоторое действие и присваивание одновременно:

+= -= /=

*= %= <<= >>= &= ^= |=

Например,

 

int A = 5 ;

// объявление и инициализация переменной A

A += 2 ;

// увеличивает значение переменной A на два

Эти операторы трактуются компилятором как бинарные. Если операторные функции являются членами класса, то первый операнд является текущим, а второй – параметром. При выполнении указанных операторов состояние текущего объекта, как правило, изменяется.

В классе задач, для которых мы создаём класс Vec, требуется операция поворота вектора на заданный угол, для которой удобно определить операции сдвига и сдвига с присваиванием. Для поворота вектора против часовой стрелки (положительный угол поворота) определим сдвиг влево, по часовой стрелке

– сдвиг вправо. Если угол поворота измеряется в градусах, то второй операнд задаётся целым числом, если в радианах – числом с плавающей точкой.

Следующий пример показывает, как определить операторы сдвига и сдвига с присваиванием для класса Vec.

class Vec

Файл Vec.h

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

{

 

• • •

 

public:

 

Vec operator << ( double f ) ;

// перегрузка оператора сдвига влево с вещественным параметром

Vec operator << ( int f ) ;

// перегрузка оператора сдвига влево с целым параметром

Vec& operator <<= ( int f ) ;

// перегрузка оператора сдвига влево c присваиванием

} ;

Файл Vec.h

#include "Vec.h"

 

// возвращает вектор, повёрнутый на f радиан против часовой стрелки

Vec Vec :: operator << ( double f )

{

Vec T ("T") ;

T.x = x*cos ( f ) - y*sin ( f ) ; T.y = x*sin ( f ) + y*cos ( f ) ; return T ;

}

//объявляет временный объект

//вычисляет проекции

//повёрнутого вектора

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

// возвращает вектор, повёрнутый на f градусов против часовой стрелки

Vec Vec :: operator << ( int f )

{

Vec T ("T") ; // объявляет временный объект

const double pi = 4 * atan ( 1 ) ; // объявляет и инициализирует константу π double F = f * pi / 180.0 ; // пересчитывает градусы в радианы

Выжол Ю.А.

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

// неполное объявление класса вектора
// класс точки
// перегрузка оператора сложения точки и вектора
// класс вектора
// имя вектора // проекции вектора

Лекция 8

Перегрузка операторов

8

T = *this << F ; return T ;

}

//вызывает операторную функцию Vec :: operator << ( double )

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

// поворачивает текущий вектор на f градусов против часовой стрелки

Vec& Vec :: operator <<= ( int f )

{

Vec T ("T") ;

// объявляет временный вектор

T = *this << f ;

// вызывает операторную функцию Vec :: operator << ( int )

*this = T ;

// передаёт повёрнутый временный вектор в текущий объект

return *this ;

// возвращает текущий объект

}

 

#include "Vec.h"

Файл Main.cpp

 

void main ( )

 

{

 

Vec V ("V", 1 , 0 ) ,W ("W") ;

// объявляет вектора

~ ( W = V << 45 ) ;

// вычисляет и выводит на экран повёрнутый вектор

~ ( W <<= 45 ) ;

// поворачивает вектор и выводит его на экран

}

 

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

Проекции вектора W

x = 0.707107

y = 0.707107

Проекции вектора W

x = 5.55112e-017

y = 1

Перегрузка бинарных операторов, использующих объекты двух классов

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

B = A + AB ;

Сначала рассмотрим реализацию перегрузки сложения точки и вектора с помощью операторной функции-члена класса.

Поскольку тип первого параметра – точка, то операторная функция должна быть членом класса Dot. Операторная функция содержит параметр типа Vec. Но класс вектора объявлен позже класса точки. Поэтому нам необходимо сделать неполное объявление класса вектора. Программа, решающая поставленную задачу будет иметь вид:

Файл DotVec.h

class Vec ;

class Dot

{

• • •

public:

Dot operator + ( Vec & V ) ;

} ;

class Vec

{

char name [ 3 ] ; double x , y ;

public:

Vec ( char * pName ) { strncpy ( name , pName , 3 ) ; name [ 2 ] = '\0' ; x = 0 ; y = 0 ; } Vec ( char * pName , double X , double Y )

{ strncpy ( name , pName , 3 ) ; name [ 2 ] = '\0' ; x = X ; y = Y ; }

Vec ( char * pName , Dot A , Dot B ) ;

 

inline double GetX ( ) const

{

return x ;

}

inline double GetY ( ) const

{

return y ;

}

} ;

 

 

 

Файл DotVec.h

#include ”DotVec.h”

Выжол Ю.А.

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