- •1/ Какая функция называется булевой? Как связаны булевы функции и формулы алгебры логики?
- •2/ Сформулировать тезис Чёрча- Тьюринга.
- •3/ Какие математические модели алгоритма Вы знаете?
- •4/ Из чего состоит машина Тьюринга? Как она работает?
- •5/ Как определяется словарная функция f? в каком случае мы говорим, что машина
- •37.Машины Тьюринга как словарные функции.
- •8/ В чем заключается проблема остановки машины Тьюринга. Является ли она алгоритмически разрешимой?
- •9/ Как определяется временная сложность алгоритма?
- •10/ Что означает выражение «Задача решается за реальное время»?
- •11/ Какие задачи попадают в класс p? Какие задачи попадают в класс np? Как эти классы связаны между собой? (p-np – проблема).
- •Перечислите основные типы грамматик по классификации Хомского. Какому типу соответствуют алгоритмические языки?
- •Что такое регулярные (автоматные) грамматики? Какие типы распознающих устройств используются для распознавания регулярных грамматик?
- •Какая модель представления знаний называется продукционной? в чем ее достоинства и недостатки?
- •В чем состоит задача синтаксического анализа? Что такое синтаксические деревья? Каким образом они строятся?
- •Какие две основные стратегии синтаксического разбора вы знаете? в чем состоит основная проблема разбора?
- •2/ Какие базовые понятия лежат в основе ооп?
- •6/ Поясните такие понятия объектно-ориентированного программирования как класс, объект класса.
- •7/ Что такое наследование классов? Простое и множественное наследования.
- •8/ Инкапсуляция. Что дает инкапсуляция?
- •9/ Определите понятие конструктора класса.
- •10/ Полиморфизм. Примеры реализации полиморфизма.
9/ Определите понятие конструктора класса.
В объектно-ориентированном программировании конструктор класса (от англ. constructor, иногда сокращают ctor) — специальный блок инструкций, вызываемый при создании объекта.
Конструктор схож с методом, но отличается от метода тем, что не имеет явным образом определённого типа возвращаемых данных, не наследуется, и обычно имеет различные правила для рассматриваемых модификаторов. Конструкторы часто выделяются наличием одинакового имени с именем класса, в котором объявляется. Их задача — инициализировать члены объекта и определить инвариант класса, сообщив в случае некорректности инварианта. Корректно написанный конструктор оставит объект в «правильном» состоянии. Неизменяемые объекты тоже должны быть проинициализированы конструктором.
Термин «конструктор» также используется для обозначения одного из тегов, описывающих данные в алгебраическом типе данных. Это использование несколько отличается от описываемого в статье. Для дополнительной информации смотрите Алгебраический тип данных.
В большинстве языков конструктор может быть перегружен, что позволяет использовать несколько конструкторов в одном классе, причём каждый конструктор может иметь различные параметры.
Назначение конструктора
Одна из ключевых особенностей ООП — инкапсуляция: внутренние поля объекта напрямую недоступны, и пользователь может работать с объектом только как с единым целым, через открытые (public) методы. Каждый метод, в идеале, должен быть устроен так, чтобы объект, находящийся в «допустимом» состоянии (то есть когда выполняется инвариант класса), после вызова метода также оказался в допустимом состоянии. И первая задача конструктора — перевести поля объекта в такое состояние.
Вторая задача — упростить пользование объектом. Объект — не «вещь в себе», ему часто приходится требовать какую-то информацию от других объектов: например, объект File, создаваясь, должен получить имя файла. Это можно сделать и через метод:
File file;
file.open("in.txt", File::omRead);
Но удобнее открытие файла сделать в конструкторе:[1]
File file("in.txt", File::omRead);
[править]
Виды конструкторов
Некоторые языки программирования различают несколько особых типов конструкторов:
конструктор по умолчанию — конструктор, не принимающий аргументов;
конструктор копирования — конструктор, принимающий в качестве аргумента объект того же класса (или ссылку из него);
конструктор преобразования — конструктор, принимающий один аргумент (эти конструкторы могут вызываться автоматически для преобразования значений других типов в объекты данного класса).
Конструктор по умолчанию
Основная статья: Конструктор по умолчанию
Конструктор не имеющий обязательных аргументов. Используется при создании массивов объектов, вызываясь для создания каждого экземпляра. В отсутствие явно заданного конструктора по умолчанию его код генерируется компилятором (что на исходном тексте, естественно, не отражается).
[править]
Конструктор копирования
Основная статья: Конструктор копирования
Конструктор, аргументом которого является ссылка на объект того же класса. Применяется в C++ для передачи объектов в функции по значению.
Конструктор копирования в основном необходим, когда объект имеет указатели на объекты, выделенные в куче. Если программист не создаёт конструктор копирования, то компилятор создаст неявный конструктор копирования, который копирует указатели как есть, то есть фактическое копирование данных не происходит и два объекта ссылаются на одни и те же данные в куче. Соответственно попытка изменения «копии» повредит оригинал, а вызов деструктора для одного из этих объектов при последующем использовании другого приведёт к обращению в область памяти, уже не принадлежащую программе.
Аргумент должен передаваться именно по ссылке, а не по значению. Это вытекает из коллизии: при передаче объекта по значению (в частности, для вызова конструктора) требуется скопировать объект. Но для того, чтобы скопировать объект, необходимо вызвать конструктор копирования.
[править]
Конструктор преобразования
Конструктор, принимающий один аргумент. Задаёт преобразование типа своего аргумента в тип конструктора. Такое преобразование типа неявно применяется только если оно уникально.
[править]
Виртуальный конструктор
Конструктор не бывает виртуальным в смысле виртуального метода — для того, чтобы механизм виртуальных методов работал, нужно запустить конструктор, который автоматически настроит таблицу виртуальных методов данного объекта.
«Виртуальными конструкторами» называют похожий, но другой механизм, присутствующий в некоторых языках — например, он есть в Delphi, но нет в C++ и Java. Этот механизм позволяет создать объект любого заранее неизвестного класса при двух условиях:
этот класс является потомком некоего наперёд заданного класса (в данном примере это класс TVehicle);
на всём пути наследования от базового класса к создаваемому цепочка переопределения не обрывалась. При переопределении виртуального метода синтаксис Delphi требует ключевое слово overload, чтобы старая и новая функции с разными сигнатурами могли сосуществовать, override для переопределения функции либо reintroduce для задания новой функции с тем же именем — последнее недопустимо.
