![](/user_photo/_userpic.png)
Яп
.pdf![](/html/75508/276/html_8rnNSBwA5c.Iz7G/htmlconvd-6VjTN_71x1.jpg)
Явное приведениетипов в С++
•const_cast - преобразуеттип операнда с пометкой const в аналогичный тип, но без пометки const
•Пример С++
Положим, что есть переменнаятипа Key, которая хранит пароль системы:
Key key;
В целях безопасностипользователю выдается указательна ключ как на константу:
const Key *ptr_key;
Но пользователь хочет получить возможность изменять пароль,поэтому он создаетсвойуказатель при помощи оператораconst_cast:
Key *myPtr= const_cast<Key *>(ptr_key);
Теперьон может делатьс паролем все, что угодно.281
Явное приведениетипов в С++
•dynamic_cast - применяется для преобразования ссылки или указателя на объект базового класса в ссылку или указатель на объект другого, родственного класса.
TYPE& dynamic_cast<TYPE&> (object);
TYPE* dynamic_cast<TYPE*> (object);
•динамическое приведения типов во время выполнения
•если неправильное приведение типов то вызывается исключительная ситуация:
ostd::bad_cast – для сылок
oдля указателей будет возвращен 0.
283
2/27/2023
Явное приведениетипов в С++
•reinterpret_cast - осуществляет низкоуровневую переинтерпретацию битов его операнда, жестко машиннозависим!!!
int ptr_int;
char рtr_char = reinterpret_cast<char >(ptr_int)
•Фактическим типом объекта, адрес которого содержит указательрtr_char, является int, а не символьныйтип.
•Любая попытка применения указателя там, где необходим обычный символьный указатель, скорее
всего, потерпит неудачу именно в период выполнения. 282
Явное приведениетипов
•Автоматическое приведение типов освобождает программиста от рутинной работы, которая потребовалась бы для явного введения в программу операций преобразования типов.
•С другой стороны, приведение типов может скрыть наличие других, более серьезных ошибок, которые в противном случае могли бы быть замечены при компиляции.
•Наиболее современные языки отражают тенденцию перехода к статической типизации, отказываются от неявного приведения типов - любое несоответствие типов, за малым исключением, воспринимается как ошибка.
284
71
![](/html/75508/276/html_8rnNSBwA5c.Iz7G/htmlconvd-6VjTN_72x1.jpg)
Перегрузка
•Перегрузка - возможность использования одноимённых подпрограмм или операторов, различающихся типом или количеством параметров в пределах одной области видимости.
•Компилятор однозначно идентифицирует функцию по ее имени и набору аргументов.
•Для компилятора функции с одинаковыми именами, но различными типами аргументов - разные функции.
285
Перегрузка. Пример
int add_values(inta,intb)
{return(a+ b); }
int add_values(floata, float b) { return(a+ b); }
int add_values(inta, intb, intc) { return(a+ b + c); }
void main(void)
{
cout<< "200+ 801= " << add_values(200,801)<< endl;
cout<< "100+ 201+ 700 = " << add_values(100,201, 700) << endl; cout<< “0.5 + 3.7= ”<< add_values(0.5+3.7)<< endl;
}
287
2/27/2023
Перегрузка
• Механизм реализации в языке:
1.Вводитсяправило, по которомуоперации опознаютсякомпиляторомпо имении по типамих параметров.
2.Для определения и переопределения операций в язык вводятся соответствующие синтаксические конструкции. Вида:
«<операнд1> <знакОперации> <операнд2>»
принципиально аналогична вызову функции
«<знакОперации>(<операнд1>,<операнд2>)».
3.Разрешаетсяописывать поведение операторов в виде функций.
286
Перегрузка
•Улучшает удобочитаемость программ
•Идентификация - сложность выбора конкретной реализации в случае, если нет точного совпадения типов для аргументов.
Пример:
int add_values(int a,intb) { return(a + b); } int add_values(float a, float b) { return(a + b); }
int add_values(int a, int b, intc) { return(a+ b + c); } inta= 5;
float b= 5,6;
cout<< add_values(a,b)
Какая из перегруженных функций будет вызвана???
288
72
![](/html/75508/276/html_8rnNSBwA5c.Iz7G/htmlconvd-6VjTN_73x1.jpg)
Перегрузка
Варианты решения:
1.требовать однозначныйподходящийвариант перегруженной функции;
2.предоставить выбор компилятору:
•выбирается вариант, не приводящий к потере информации при преобразованиитипов.
•если существует более одного варианта – выдать ошибку.
289
РОДОВЫЕ НАСТРАИВАЕМЫЕ СЕГМЕНТЫ И ШАБЛОНЫ
291
2/27/2023
Перегрузка
•Приоритет и ассоциативность - порядок выполнения и следование операндов.
•Если заданы жёстко — неудобно(например, для операцийс множествами приоритеты отличаются от арифметических).
•Если заданы программистом— это становится дополнительнымисточникомошибок.
•Пример: операцияa+b все нормально для чисел, но для строк важен порядок, т.к. это конкатенация и a+b != b+a
290
Родовые сегменты и шаблоны
•Понятие «родовые настраиваемыесегменты» старо и использовалось в Ada.
•Родовые функции в языке С++ называются функциями-
шаблонами.
•Объявления функции-шаблона имеет следующую общую форму:
template <параметры шаблона>
•Функция-шаблон должна иметь хотя бы один родовой параметр,представляемыйв одной из следующих форм:
•class имя_родового_параметра
•typename имя_родового_параметра
292
73
![](/html/75508/276/html_8rnNSBwA5c.Iz7G/htmlconvd-6VjTN_74x1.jpg)
Родовые сегменты и шаблоны
Пример C++
template <typenameT> T sqr(T x)
{ return x x; }
В результате для каждого типа параметра, с которым будет вызываться функция, компилятор будет автоматически генерировать соответствующую конкретную функцию — к примеру:
inta = 3; double b = 5.0;
int х = sqr(a); // компиляторгенерирует sqr() для T = int double у = sqr(b); // компиляторгенерирует sqr() для T =
double
293
ВАРИАНТНЫЕ ЗАПИСИ И НЕОГРАНИЧЕННЫЕ ЗАПИСИ
295
2/27/2023
Родовые сегменты и шаблоны
Пример C++
template <typename Т> T max(T a, Т b)
{ return a > b ? a : b; }
294
Вариантные записи
• Вариантная запись – это запись, которая состоит из фиксированного числа полей, но позволяющая поразному рассматриватьобласти памяти, занимаемые полями. Поля являются альтернативными.
Предположим, что мы хотимсоздать вариантную запись, поля которой могут бытьили массивом, или записью:
typedefint Arr[10]; // вот таким массивом typedefstruct{ // или вот такой структурой float f1;
inti1;
}Rec;
296
74
![](/html/75508/276/html_8rnNSBwA5c.Iz7G/htmlconvd-6VjTN_75x1.jpg)
Вариантные записи
# определим тип, который кодирует вариант: typedefenum{Record_Code, Array_Code} Codes; typedefstruct {
Codes code; /* Общееполе тега */
union { /* Объединениес альтернативнымиполями */ Аrr а; /* Вариантмассива */
Rес r; /* Вариантзаписи */
}data;
}S_Type;
# использование
S_Type s;
if (s.code== Array_Code)
i= s.data.a[4]; /* Выбор первого варианта, работаем как с массивом */ else
i= s.data.r.h; /* Выбор второго варианта, работаем как с записью */
297
UML
•UML – это язык графического описания для объектного моделирования в области разработки программного обеспечения.
•UML является языком широкого профиля, это открытый стандарт, использующий графические обозначения для создания абстрактной модели системы, называемой UML моделью.
299
2/27/2023
Унифицированный язык моделирования UML (Unified Modeling Language)
298
Назначение UML
•Создан для определения, визуализации, проектирования и документирования в основном программных систем.
•Моделирование бизнес-процессов.
•Системное проектирование.
•Отображение организационных структур.
300
75
![](/html/75508/276/html_8rnNSBwA5c.Iz7G/htmlconvd-6VjTN_76x1.jpg)
2/27/2023
Типы UML диграмм
•диаграммаактивности(деятельности);
•диаграммаклассов;
•диаграмма связей;
•диаграмма компонентов;
•диаграмма составных структур;
•диаграмма развертывания;
•диаграмма обзора взаимодействий;
•диаграммаобъектов;
•диаграмма пакетов;
•циклограмма;
•диаграммамашинсостояния;
•диаграмма синхронизации;
• диаграмма прецедентов. |
301 |
302 |
Диаграмма активности |
Диаграмма активности |
Диаграммы активностей (Activity Diagrams) - представление алгоритмов неких действий (активностей), выполняющихся в системе.
Начальное состояние |
Конечное состояние |
Конечное состояниепотока |
Распараллеливание |
Синхронизация |
303 |
304 |
76
![](/html/75508/276/html_8rnNSBwA5c.Iz7G/htmlconvd-6VjTN_77x1.jpg)
Диаграмма активности
Имя дорожки (объект или роль)
Траектория/поток объекта
Дорожки объектов - часть областидиаграммы деятельности, на которой отображаются
только те деятельности, за которые отвечаетконкретный объект.
305
Диаграмма прецедентов
Цели создания диаграмм прецедентов:
•определение границы и контекста моделируемой предметной области на ранних этапах проектирования;
•формирование общих требований к поведению проектируемой системы;
•разработка концептуальной модели системы для ее последующей детализации;
•подготовка документации для взаимодействия с заказчиками и пользователями системы.
307
2/27/2023
Диаграмма активности
Вложенная диаграмма |
306 |
Диаграмма прецедентов
Эктор (actor) - это множество логически связанныхролей, исполняемыхпри взаимодействии с прецедентами или сущностями(система,подсистема или класс).Эктором может быть человек или другая система,подсистема или класс, которые представляют нечто вне сущности.
Прецедент (use case) - описание множества последовательныхсобытий (включая варианты), выполняемых системой,которые приводят к наблюдаемомуэктором результату.
Прецеденты и экторы соединяютсяс помощью линий. Стрелка направленак тому,у кого запрашиваютсервис
308
77
![](/html/75508/276/html_8rnNSBwA5c.Iz7G/htmlconvd-6VjTN_78x1.jpg)
Диаграмма прецедентов
Прецеденты и экторы соединяютсяс помощью линий. Стрелка направленак тому,у кого запрашиваютсервис
309
Диаграмма состояний
|
|
[Буква||Символ|| |
|
[Последний символ |
|
[Символ ACII>32] |
Пропуск |
Знак] |
|
текста] |
Конец предложения |
|
|
|
Символ |
|
|
|
entry/Сохранить_начало |
|
|
|
entry/Сохранить_конец |
|
|
|
[. || ! || [?]Иначе] |
|
|
|
|
|
|
[Прописная буква|| |
|
|
[Иначе] |
[Иначе] |
Точка |
последний символ] |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
[Пробел|| |
|
|
|
|
|
Cкобка|| |
|
Состояние: |
|
[. || ! || ?] |
Кавычка] |
[Прописная буква|| |
|
|
|
|
последний символ] |
||
• имя; |
|
|
|
|
|
• деятельность по входу ; |
|
Пробел |
|
|
|
• деятельность по выходу ; |
|
|
|
|
• деятельность в состоянии ; |
[Пробел] |
• внутреннийпереход. |
Переходы |
|
Условие
перехода
311
2/27/2023
Диаграмма состояний
•Диаграммы состояний применяются для того,
чтобы объяснить, какимобразомработают сложные объекты и как объект переходит из одного состояния в другое.
•Объекты характеризуются поведением и состоянием, в котором находятся.
•Состояние (state) - ситуация в жизненном цикле объекта, во время которой он удовлетворяет некоторому условию, выполняет определенную деятельность или ожидает какого-то события. Состояние объекта определяется значениями некоторых его атрибутов и присутствием или отсутствием связей с другими объектами.
310
312
78
![](/html/75508/276/html_8rnNSBwA5c.Iz7G/htmlconvd-6VjTN_79x1.jpg)
Диаграмма классов
•Диаграммаклассов описывает статическую структуру системы, показываяеё классы, их атрибуты и методы, и также взаимосвязи этих классов.
+ |
открытый |
видендля любого другого класса |
|
(public) |
|
- |
закрытый |
не виденвнешнимиклассами |
|
(private) |
(объектами) и может |
|
|
использоваться только объектом, |
|
|
его содержащим |
# |
защищенный |
виденвнутри самого класса,для |
|
(protected) |
потомков данного класса |
|
|
|
~ |
пакетный |
видендля клиента класса, |
|
(package) |
объявленногов том же пакете |
|
|
313 |
Объектно-ориентированное программирование
315
2/27/2023
Объектно-ориентированное программирование https://risik.info/?page_id=1015
314
•Объектно-ориентированное программирование
(ООP) – это методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляромопределенного класса, а
классыобразуют иерархию наследования.
•Объектно-ориентированное проектирование
(OOD) – часть объектно-ориентированной методологии, которая предоставляетвозможность программистам оперировать понятием«объект», вместо понятия «процедура» при разработке своего кода.
•Объектно-ориентированный анализ (OOA) – это методология, при которой требования к системе воспринимаются с точки зрения классови объектов, выявленных в предметнойобласти.
316
79
![](/html/75508/276/html_8rnNSBwA5c.Iz7G/htmlconvd-6VjTN_80x1.jpg)
Связь ООА, ООP, OOD
•На результатах OOA формируются модели, на которых основывается OOD, OOD в свою очередь создает фундамент для окончательной реализации системы с использованием методологии OOP.
317
Преимущества объектной модели:
•Позволяет использовать возможности ОО языков программирования.
•Повышает уровень унификации разработки и пригодность для повторного использования программ и проектов.
•Приводит к построению системна основе стабильных промежуточных описаний, что упрощает процесс внесения изменений.
•Уменьшает риск разработки сложных систем. ОО проектирование – это единственнаяметодология, позволяющая справиться со сложностью, присущей большим системам.
•Ориентирована на человеческоевосприятие мира.319
2/27/2023
ООЯП
•Язык программирования является объектноориентированным тогда и только тогда, когда выполняются следующие условия:
1.Поддерживаются объекты, т.е. абстракции данных, имеющие интерфейс в виде именованных операций и собственные данные, с ограничением доступа к ним.
2.Объекты относятся к соответствующим типам (классам)
3.Типы (классы) могут наследовать атрибуты супертипов (суперклассов).
318
Классы
•Класс – это абстрактный тип данных, снабженный некоторой реализацией.
•Полностью реализованный класс называется эффективным.
•Класс, который реализован лишь частично или не реализован вовсе называется
отложенным.
•Различают внутреннее представление класса (реализацию) и внешнее представление класса (интерфейс).
320
80