Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Яп

.pdf
Скачиваний:
28
Добавлен:
15.03.2023
Размер:
6.44 Mб
Скачать

Явное приведениетипов в С++

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

Перегрузка

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

Компилятор однозначно идентифицирует функцию по ее имени и набору аргументов.

Для компилятора функции с одинаковыми именами, но различными типами аргументов - разные функции.

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

Перегрузка

Варианты решения:

1.требовать однозначныйподходящийвариант перегруженной функции;

2.предоставить выбор компилятору:

выбирается вариант, не приводящий к потере информации при преобразованиитипов.

если существует более одного варианта – выдать ошибку.

289

РОДОВЫЕ НАСТРАИВАЕМЫЕ СЕГМЕНТЫ И ШАБЛОНЫ

291

2/27/2023

Перегрузка

Приоритет и ассоциативность - порядок выполнения и следование операндов.

Если заданы жёстко — неудобно(например, для операцийс множествами приоритеты отличаются от арифметических).

Если заданы программистом— это становится дополнительнымисточникомошибок.

Пример: операцияa+b все нормально для чисел, но для строк важен порядок, т.к. это конкатенация и a+b != b+a

290

Родовые сегменты и шаблоны

Понятие «родовые настраиваемыесегменты» старо и использовалось в Ada.

Родовые функции в языке С++ называются функциями-

шаблонами.

Объявления функции-шаблона имеет следующую общую форму:

template <параметры шаблона>

Функция-шаблон должна иметь хотя бы один родовой параметр,представляемыйв одной из следующих форм:

class имя_родового_параметра

typename имя_родового_параметра

292

73

Родовые сегменты и шаблоны

Пример 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

Вариантные записи

# определим тип, который кодирует вариант: 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

2/27/2023

Типы UML диграмм

диаграммаактивности(деятельности);

диаграммаклассов;

диаграмма связей;

диаграмма компонентов;

диаграмма составных структур;

диаграмма развертывания;

диаграмма обзора взаимодействий;

диаграммаобъектов;

диаграмма пакетов;

циклограмма;

диаграммамашинсостояния;

диаграмма синхронизации;

• диаграмма прецедентов.

301

302

Диаграмма активности

Диаграмма активности

Диаграммы активностей (Activity Diagrams) - представление алгоритмов неких действий (активностей), выполняющихся в системе.

Начальное состояние

Конечное состояние

Конечное состояниепотока

Распараллеливание

Синхронизация

303

304

76

Диаграмма активности

Имя дорожки (объект или роль)

Траектория/поток объекта

Дорожки объектов - часть областидиаграммы деятельности, на которой отображаются

только те деятельности, за которые отвечаетконкретный объект.

305

Диаграмма прецедентов

Цели создания диаграмм прецедентов:

определение границы и контекста моделируемой предметной области на ранних этапах проектирования;

формирование общих требований к поведению проектируемой системы;

разработка концептуальной модели системы для ее последующей детализации;

подготовка документации для взаимодействия с заказчиками и пользователями системы.

307

2/27/2023

Диаграмма активности

Вложенная диаграмма

306

Диаграмма прецедентов

Эктор (actor) - это множество логически связанныхролей, исполняемыхпри взаимодействии с прецедентами или сущностями(система,подсистема или класс).Эктором может быть человек или другая система,подсистема или класс, которые представляют нечто вне сущности.

Прецедент (use case) - описание множества последовательныхсобытий (включая варианты), выполняемых системой,которые приводят к наблюдаемомуэктором результату.

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

308

77

Диаграмма прецедентов

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

309

Диаграмма состояний

 

 

[Буква||Символ||

 

[Последний символ

[Символ ACII>32]

Пропуск

Знак]

 

текста]

Конец предложения

 

 

 

Символ

 

 

 

entry/Сохранить_начало

 

 

 

entry/Сохранить_конец

 

 

 

[. || ! || [?]Иначе]

 

 

 

 

 

 

[Прописная буква||

 

[Иначе]

[Иначе]

Точка

последний символ]

 

 

 

 

 

 

 

 

 

 

 

 

[Пробел||

 

 

 

 

 

Cкобка||

 

Состояние:

 

[. || ! || ?]

Кавычка]

[Прописная буква||

 

 

 

последний символ]

• имя;

 

 

 

 

 

• деятельность по входу ;

 

Пробел

 

 

• деятельность по выходу ;

 

 

 

 

• деятельность в состоянии ;

[Пробел]

• внутреннийпереход.

Переходы

 

Условие

перехода

311

2/27/2023

Диаграмма состояний

Диаграммы состояний применяются для того,

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

Объекты характеризуются поведением и состоянием, в котором находятся.

Состояние (state) - ситуация в жизненном цикле объекта, во время которой он удовлетворяет некоторому условию, выполняет определенную деятельность или ожидает какого-то события. Состояние объекта определяется значениями некоторых его атрибутов и присутствием или отсутствием связей с другими объектами.

310

312

78

Диаграмма классов

Диаграммаклассов описывает статическую структуру системы, показываяеё классы, их атрибуты и методы, и также взаимосвязи этих классов.

+

открытый

видендля любого другого класса

 

(public)

 

-

закрытый

не виденвнешнимиклассами

 

(private)

(объектами) и может

 

 

использоваться только объектом,

 

 

его содержащим

#

защищенный

виденвнутри самого класса,для

 

(protected)

потомков данного класса

 

 

 

~

пакетный

видендля клиента класса,

 

(package)

объявленногов том же пакете

 

 

313

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

315

2/27/2023

Объектно-ориентированное программирование https://risik.info/?page_id=1015

314

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

(ООP) – это методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляромопределенного класса, а

классыобразуют иерархию наследования.

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

(OOD) – часть объектно-ориентированной методологии, которая предоставляетвозможность программистам оперировать понятием«объект», вместо понятия «процедура» при разработке своего кода.

Объектно-ориентированный анализ (OOA) – это методология, при которой требования к системе воспринимаются с точки зрения классови объектов, выявленных в предметнойобласти.

316

79

Связь ООА, ООP, OOD

На результатах OOA формируются модели, на которых основывается OOD, OOD в свою очередь создает фундамент для окончательной реализации системы с использованием методологии OOP.

317

Преимущества объектной модели:

Позволяет использовать возможности ОО языков программирования.

Повышает уровень унификации разработки и пригодность для повторного использования программ и проектов.

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

Уменьшает риск разработки сложных систем. ОО проектирование – это единственнаяметодология, позволяющая справиться со сложностью, присущей большим системам.

Ориентирована на человеческоевосприятие мира.319

2/27/2023

ООЯП

Язык программирования является объектноориентированным тогда и только тогда, когда выполняются следующие условия:

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

2.Объекты относятся к соответствующим типам (классам)

3.Типы (классы) могут наследовать атрибуты супертипов (суперклассов).

318

Классы

Класс – это абстрактный тип данных, снабженный некоторой реализацией.

Полностью реализованный класс называется эффективным.

Класс, который реализован лишь частично или не реализован вовсе называется

отложенным.

Различают внутреннее представление класса (реализацию) и внешнее представление класса (интерфейс).

320

80