Вы находитесь на странице: 1из 6

Домашнее задание: Система

типов в С++
Каким образом производится проверка типов: статически или
динамически? Если динамически, существует ли
возможность снабдить код программы аннотациями типов и
статически проверять их? (В случае динамически
типизированного языка, далее вопросы касаются в том числе
статических аннотаций для него.)

В языке C++ проверка типов происходит статически, в момент компиляции

Является ли рассматриваемая система типов Тьюринг-


полной? Всегда ли проверка типов завершается за конечное
время с корректным вердиктом?

Да, является, так как при компиляции проверяется вся программа полностью,
вне зависимости от того, что мы можем не зайти в данную ветку/функцию.
Компиляция завершается либо с ошибкой либо запускается программа,
поэтому да, всегда завершается.

Как вы считаете, насколько сильной или слабой системой


типов обладает язык?

Она достаточно строгая, мы не можем складывать например числа со


строками, но язык умеет делать преобразования чтобы вычислять некоторые
выражения, состоящие из значений разных типов а также позволяет
программисту самому определять как себя вести со значениями различных
типов. Мы можем между собой складывать значения различных числовых
типов ( double и long long, char и int) а также например bool и int, потому что в
С++ bool это тоже числовой тип. Помимо этого, языке есть понятие приведения
типов. Например, мы для какой-то своей структуры можем определить, что она
приводима к типу int, и после этого можем например складывать с числами.
Кроме того, компилятор умеет неявно приводить некоторые типы к другим.

Домашнее задание: Система типов в С++ 1


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

Есть ли возможность использовать вывод типов? Если да, то


как он работает?

Да, есть, с использованием ключевого слова auto. Компилятор оценивает тип


выражения которое будет присваиваться переменной типа auto и заменяет при
компиляции auto на вычисленный тип. Если компилятор не может в компайл-
тайме вычислить тип, то тогда auto применить не получится. Еще можно
использовать decltype, который в компайл-тайм возвращает тип выражения.
Работает также как и auto. Его отличие от auto - он не отбрасывает *, & и
модификаторы типа volatile.

Система типов является номинативной, структурной или


утиной? Или объединяет в себе несколько черт в разных
аспектах?

Является только номинативной.

Есть ли возможность описать произвольный алгебраический


тип данных? Встроена ли эта возможность непосредственно
в систему типов или может быть смоделирована каким-либо
образом?

Явно прописанной возможности нет, но если использовать шаблоны,


std::optional и std::tuple можно попробовать смоделировать тип,
соответсвующий сумме типов, а именно

template <typename type1, typename type2>


std::tuple<std::optional<type1>, std::optional<type2>>

Домашнее задание: Система типов в С++ 2


можно также смоделировать перемножение типов:

Как в вашем языке принято сообщать об ошибках и


исключительных ситуациях?

Какое-то количество ошибок может быть найдено компилятором на этапе


компиляции. С ними программа не запустится. Если же в коде программы нет
ошибок, которые могут быть найдены во время компиляции, программа
запускается и дальше, если какая-то ошибка возникает во время исполнения и
не прописан механизм обработки, программа завершается с Runtime Error, об
этом символизирует ненулевое возвращаемое значение. Программист может
воспользоваться таким механизмом обработки ошибок как исключения. С++
позволяет бросить исключение, а также поймать брошенное исключение. Если
исключение поймалось, то программа не завершается, а выполняются какие-то
действия и возможно ошибка исправляется. Если исключение не поймалось, то
программа завершается с Terminated.

Как объявить свой тип ошибки или исключения и


воспользоваться им?

Можно создать свой класс, кидать и ловить объект этого класса. Но лучше еще
отнаследоваться от интерфейсного класса std::exception, так как С++ позволяет
ловить исключения не только родительского класса, но и всех дочерних
классов, это позволяет обрабатывать самые разнообразные ошибки одним
обработчиком.

Домашнее задание: Система типов в С++ 3


Вот пример без наследования

Вот с наследованием:

Домашнее задание: Система типов в С++ 4


Какие виды полиморфизма поддерживаются?
Воспользуйтесь классификацией с лекции.

С помощью шаблонов и класса std::tuple можем поддерживать как Polymorphic


Records, так и Polymorphic Variants, см. выше

Общие вопросы:

Что требует принцип подстановки Лисков применительно к


исключениям, которые могут выбрасывать методы?

Домашнее задание: Система типов в С++ 5


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

Какое отношение к expression problem имеет шаблон


«Посетитель»?

Посетитель — это поведенческий паттерн проектирования, который позволяет


добавлять в программу новые операции, не изменяя классы объектов, над
которыми эти операции могут выполняться.
«Expression problem» обозначают проблема выбора подхода, который позволит
добавлять в программу новые сущности и операции над ними без изменения
существующей реализации. Есть два решения - которое предлагает
функциональное программирование и которое предлагает ООП-парадигма, но
оба решения предполагают изменение классов. Однако если мы обратимся к
шаблону Посетитель, то он предлагает как раз решение этой проблемы в виде
нового класса, в который наши изначальные будут передаваться как
аргументы.

Домашнее задание: Система типов в С++ 6

Вам также может понравиться