Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тельнов по билетам.docx
Скачиваний:
5
Добавлен:
07.04.2023
Размер:
3.61 Mб
Скачать

Канонические диаграммы языка uml 2.X

X билет)

1)Язык Си: оператор определения типа. Примеры.

Определение типа

Формат: typedef <спецификация-типа> <описатели> ;

Примеры:

Typedef void* DRAW (char , void*); вводится новый тип функций DRAW

Объявление

DRAW box; void * box(char , void*);

Typedef struct node { вводится новый тип Т, который удобен для

Struct node* left; описания узлов двоичных деревьев

Struct node* right; тип Tp описывает указатели на узлы

String s; двоичных деревьев

} T, *Tp;

Typedef char* string; вводится новый тип String

String p,x[],f(); определены: переменная p и массив x объектов типа

STRING; функция f возвращает объекты типа STRING

2)Наследование классов. Пример с Абстрактными фигурами.

Наследованием называется процесс порождения одного класса от другого класса с сохранением и/или перекрытием свойств и методов класса-предка и добавлением, при необходимости, новых свойств и методов в классы-потомки.

Набор классов, связанных отношением наследования, называют иерархией классов или схемой наследования.

Пример наследования. Фигуры на экране.

Рассмотрим следующую схему наследования:

Общим свойством всех фигур на экране, независимо от их формы, является наличие координат (класс TLocation).

Любая фигура на экране должна “уметь” себя отобразить, скрыть своё изображение, а также перемещаться по экрану (класс TFigure).

enum bool { false, true };

class TLocation {

protected:

int X, Y; // координаты фигуры на экране

public:

TLocation ( int a, intb ){X =a; Y =b;} // конструктор

int GetX ( ) { return X; } // получение координаты Х

int GetY () { return Y; } // получение координаты У

};

class TFigure : public TLocation { // абстрактная фигура-окружность

protected:

bool Vision; // признак видимости фигуры на экране

public:

TFigure ( int a, int b ) : TLocation ( a, b ) {} // конструктор

void Show ( ) {} // метод будет перекрыт у потомков класса

void Hide ( ) { } // метод будет перекрыт у потомков класса

bool IsVisible ( ) { return Vision; } // получение признака видимости

void MoveTo ( int newX, int newY ) { // перемещение фигуры по экрану

bool V = IsVisible ( ); // признак видимости фигуры

if ( V ) Hide ( ); // если фигура видима-скроем её

X = newX; Y = newY; //изменим координаты фигуры

if (V ) Show ( ); } // если фигура была видима-покажем её на новом месте

};

class TCircle : public TFigure { // конкретная фигура-окружность

int R; // радиус окружности

public:

TCircle ( int a, int b, intr): TFigure (a,b ){R=r;} // конструктор

void Show ( ) { // Перекрываем метод Show

// используем графические примитивы из GDI+ для Win32

// hdс - дескриптор контекста графического устройства

// hdc всегда известен для окна, в котором будем рисовать

Ellipse( hdc, X-R, Y-R, X+R, Y+R ); // рисует окружность

Vision = true; } //фигура видна

void Hide ( ) { // перекрываем метод Hide

// сохраним цвет текущего полотна(считаем, что фон полотна-белый)

HGDIOBJ pen = SelectObject(hdc,GetStockObject(DC_PEN));

SetDCPenColor(hdc, RGB(0,0,0) ); // установим белый цвет пера

Ellipse( hdc, X-R, Y-R, X+R, Y+R ); // отобразим круг цветом фона

SelectObject(hdc, pen ); // восстановим цвет текущего пера

Vision = false; } // фигура не видна

};

Обратите внимание на то, что метод MoveTo, разработанный для абстрактной фигуры TFigure, теперь будет работать для любой конкретной фигуры.

3)Пергруженные операции. Формализм на языке С++. Пример.

С++ позволяет переопределять большинство операций языка так, чтобы при использовании с объектами конкретных классов эти операции выполнялись специфически образом, через специально заданные функции.

Конкретно, можно перегружать следующие операции языка: + - * / % ^ & | ~ ! = += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ -- ->* , -> [] () new delete

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

Для дальнейшего изложения обозначим @ - некоторую перегружаемую операцию языка С++. Пусть х и у – объекты некоторых классов С++.

Перегрузка унарных операций.

@x – унарная операция над объектом х в префиксной форме интерпретируется как вызов функции-члена

x.operator@() без аргументов

или вызов friend-функции с именем

operator@(x) с одним аргументом.

x@ - унарная операция над объектом х в постфиксной форме интерпретируется как вызов функции члена

x.operator@(int) , где аргумент типа int – фиктивный

или вызова friend-функции с именем

operator@(x, int), где аргумент типа int – фиктивный.

Перегрузка бинарных операций.

x@y – бинарная операция с объектами х и у интерпретируется как вызов функции-члена

x.operator@(y) с одним аргументом

или вызов friend-функции с именем

operator@(x, y) с двумя аргументами.

Замечания к перегруженным операциям.

  • При перегрузке операций, полностью сохраняется синтаксис языка С++в том числе приоритет и порядок выполнения операций.

  • Можно перегрузить операции new и delete и начать самостоятельно управлять процессами выделения и освобождения динамической памяти.

  • Можно перегрузить операцию индексации []. Индексы могут иметь любой тип (например, цвет, текст, др.). Это есть ассоциативные массивы.

  • Итераторы в контейнерах можно заменить «умными» перегруженными операциями «++» и «--», которые при обходе не позволяют выйти за пределы контейнера.

  • Можно переопределить операцию косвенной адресации объекта «->» для работы с умными указателями, которые при каждом обращении к объекту будут выполнять любую заданную им работу.

  • Можно перегрузить операцию вызова функции, тогда запись вида <объект> ( <список-аргументов>) будет рассматриваться как бинарная операция operator() (…).

  • Можно перегрузить операцию преобразования типа (собственный кастинг).