Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lr1.ООП.2015.pdf
Скачиваний:
22
Добавлен:
16.03.2016
Размер:
498.51 Кб
Скачать

Перегрузка операций

Язык Си++ поддерживает средства, которые позволяют переопределять уже существующие операции. Такое переопределение называют перегрузкой (overloading) операций.

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

1.За исключением операций new и delete, операции должны быть нестатическими функциями-элементами класса или иметь минимум один аргумент типа класса. Функ- ции-операции =, () ,[], -> должны быть нестатическими элементами класса.

2.В ранних версиях языка Си++ постфиксные и префиксные версии операторов ++ и -- не различались при перегрузке. В соответствии со стандартом языка Си++ AT&T 2.1, функция operator@() рассматривается как префиксная форма оператора, тогда как функция operator@(int) соответствует постфиксной форме, параметр функции является фиктивным.

3.Операция, которая переопределяется, должна существовать в языке. Нельзя, например, определить оператор #.

4.Нельзя переопределять следующие операции: ., :: , ?:.

5.Приоритет операций при переопределении сохраняется.

6.При переопределении любой унарной операции @ выражение @x или x@ интерпретируется как x.operator@() или как operator@(x). Для любой бинарной операции @ выражение x@y интерпретируется как x.operator@(y) или как operator@(x,y).

7.Операции new и delete могут быть переопределены. Операция new должна возвращать результат типа void * и иметь первый аргумент типа size_t. Операция delete должна возвращать результат типа void и иметь первый аргумент типа void *, второй аргумент может быть типа size_t. Операции new и delete всегда являются статическими элементами класса, даже при отсутствии в их описании ключевого слова static.

Пример класса

В предлагаемом примере использованы возможности языка Си++, рассмотренные выше.

Пример:

// Заголовочный файл textpoint.h, описание класса #ifndef _TEXTPOINT_H_

#define _TEXTPOINT_H_ class TextPoint { private:

int color; //Цвет символа

int x, y; //Положение символа на экране int visible; //Видим ли символ?

static int how_many; // Сколько создано объектов класса? public:

//Конструктор по умолчанию TextPoint () {

color = 15; x = 1;

y = 1; visible = 0; how_many++;

};

//Конструктор копии

TextPoint ( const TextPoint & a ) { color = a.color;

x = a.x; y = a.y;

visible = a.visible; how_many++;

};

//Конструктор

TextPoint ( int nx, int ny, int ncolor ) { color = ncolor;

x = nx; y = ny;

visible = 0; how_many++;

};

//Деструктор ~TextPoint () {

how_many--;

};

//Доступ к данным из секции private void ChangeColor ( int newColor ) {

color = newColor;

}

int GetX ( void ) { return x;

}

int GetY ( void ) { return y;

}

int GetColor ( void ) { return color;

}

int IsVisible ( void ) { return visible;

}

static int HowMany ( void ) { return TextPoint::how_many;

}

//Методы вывода изображения, сокрытия и движения void Hide ( void );

void Show ( void ); void Mov ( int, int );

//Перегрузка операций: ++ и -- - движение по диагонали TextPoint operator ++ ( int ); //постфиксная форма TextPoint operator -- ( void ); //префиксная форма //Умножение перегружается (в данном случае) как "друг".

//Перегрузка * как элемента класса: TextPoint operator * (int). friend TextPoint operator * ( TextPoint &, int );

};

#endif

// Реализация класса - файл textpoint.cpp #include <conio.h>

#include <dos.h> #include "textpoint.h"

void TextPoint::Hide ( void ) { if ( visible ) {

gotoxy ( x, y ); textattr ( BLACK );

putch ( ' ' ); visible = 0;

}

}

void TextPoint::Show ( void ) { if ( !visible ) {

gotoxy ( x, y ); textattr ( color ); putch ( '*' ); visible = 1;

}

}

void TextPoint::Mov ( int nx, int ny ) { int was_visible = visible;

Hide();

if ( nx < 80 ) x = nx; if ( ny < 25 ) y = ny;

if ( was_visible ) Show();

}

TextPoint TextPoint::operator ++ ( int ) { Mov ( x + 1, y + 1 );

return ( *this );

}

TextPoint TextPoint::operator -- ( void ) { Mov ( x - 1, y - 1 );

return ( *this );

}

TextPoint operator * ( TextPoint &op1, int op2 ) { TextPoint temp ( op1 );

temp.x *= op2; temp.y *= op2; return temp;

}

// Главный модуль, вызов методов класса #include <conio.h>

#include <dos.h> #include <stdio.h> #include "textpoint.h"

int TextPoint::how_many = 0; //Определение и инициализация //статических данных

main () { TextPoint T1;

TextPoint T2 ( 78, 23, RED ); TextPoint T3 ( T2 ); textbackground ( BLACK ); clrscr();

--T3; T1.Show(); T2.Show(); T3.Show();

for ( int i = 0; i < 20; i++ ) { --T3;

delay ( 200 );

T3.ChangeColor ( T3.GetColor() + i );

}

for ( i = 19; i >= 0; i-- ) { T3++;

delay ( 200 );

T3.ChangeColor ( T3.GetColor() - i );

}

printf ( "\n Программа создала %d объектов класса TextPoint!", TextPoint::HowMany() );

getch();

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]