- •Цель работы
- •Темы для предварительного изучения
- •Варианты индивидуальных заданий
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Вариант 11
- •Вариант 12
- •Вариант 13
- •Вариант 14
- •Вариант 15
- •Вариант 16
- •Вариант 17
- •Вариант 18
- •Вариант 19
- •Вариант 20
- •Вариант 21
- •Вариант 22
- •Вариант 23
- •Вариант 24
- •Вариант 25
- •Вариант 26
- •Вариант 27
- •Вариант 28
- •Вариант 29
- •Вариант 30
- •Задание к выполнению
- •ТЕОРЕТИЧЕСКАЯ ЧАСТЬ.
- •Введение в язык Си++
- •Передача параметров по ссылке
- •Операторы new и delete
- •Inline-функции
- •Инкапсуляция
- •Доступ к данным и функциям класса
- •Дружественные функции
- •Статические элементы класса
- •Конструкторы и деструкторы
- •Перегрузка операций
- •Пример класса
Перегрузка операций
Язык Си++ поддерживает средства, которые позволяют переопределять уже существующие операции. Такое переопределение называют перегрузкой (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();
}