Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Языки программирования и методы трансляции.



Языки программирования и методы трансляции.

Ответы на экзаменационные вопросы.

1 курс 2 семестр

2012 год

Рекомендации:

Друзья! Если Вы хотите более точную и своевременную информацию, тогда предоставляйте ту информацию, которой обладаете.

Если бы каждый скинул всего, лишь по 2 лекции, тогда ответы на билеты появились бы гораздо раньше, ежели в последний день.

Отдельная благодарность Васильевой Екатерине и пожелавшему остаться неизвестным студенту УВП 1-ого курса.

Всего наилучшего,

Настенька.

1 вопрос.

Основные парадигмы программирования. Инкапсуляция. Наследование. Полиморфизм.

 

Парадигма программирования – это стиль написания программ, который подчиняется определенным идеям и правилам.

Основные парадигмы программирования:

1). Процедурное программирование.

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

Например, FORTRAN

2). Структурное программирование.

Акцент сместился с организации процедур на ориентацию структур данных.

Например, ALGOL-60, Pascal, Modula-2, C.

3). Модульное программирование.

Возникла идея объединить данные и процедуры их обработки в более крупные блоки – модули.

Например, FORTRAN-II, Кобол.

4). Объектно-ориентированное программирование(ООП).

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

Например, Object Pascal, C++, Java.

 

Основные принципы ООП:

1). Инкапсуляция – механизм, который связывает данные с процедурами их обработки и сохраняет их в безопасности, как от внешнего влияния, так и от ошибок использования.

2). Наследование – процесс построения иерархии классов, когда потомки наследуют все свойства своих предков, могут изменять их и добавлять новые.

3). Полиморфизм – свойство, позволяющее одинаково называть процедуры сходные по смыслу, но рассматривать их действия по разному.

2 вопрос.

Определение класса на языке С++. Спецификаторы доступа к членам класса. Оператор разрешения видимости.

Класс является абстрактным типом данных, определяемых пользователем, и представляет собой объединение данных и функций для работы с ними. Класс не связан с памятью компьютера.

Внутри класса интерфейс описывается прототипами.

Данные именуются полями, а функции – методами.



Описание синтаксиса простого класса:

class <имя класса> {[private:]<описание скрытых элементов класса>public:<описание доступных элементов>};

Есть несколько замечаний при описании синтаксиса класса:

1). При описании данных одного типа, они могут быть объединены;

2). Для обращения к элементам класса нужно указывать только имя;

3).В описании класса можно описать определение метода, если его тело является коротким.

 

Спецификаторы доступа управляют видимостью элементов класса.

Рекомендуется поля объявлять закрытыми(private), а методы для доступа к ним открытыми(public). Элементы, описанные после private, видимы только внутри класса, то есть к ним невозможно обратиться из функции, не являющейся элементом класса. Это позволяет говорить о таком признаке ООП, как инкапсуляция.

 

При определении метода вне класса необходимо сообщить компилятору, к какому классу он принадлежит, с помощью оператора доступа к области видимости ‘::’.

Например, void complex1::display() {…}

3 вопрос.

Определение объекта. Способы доступа к данным и методам автоматических и динамических объектов.

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

Для определения объекта используется следующая конструкция:

<имя класса><имя объекта>;

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

1). Глобальные объекты создаются в начале программы и разрушаются при ее завершении.

2). Автоматические объекты создаются при входе в блок и разрушаются при выходе из него.

3). Динамические объекты создаются в динамической памяти в процессе выполнения программы оператором new и разрушаются оператором delete.

 

Для автоматических объектов доступ данных не из класса осуществляется с помощью конструкции: <имя объекта>.<имя класса>::<имя поля>;

Для обращения к методу не из класса можно использовать конструкцию: <имя объекта>.<обращение к методу>;

Доступ к элементам динамических объектов предусматривает явное использование указателя на объект и операцию косвенного выбора элементов ‘->’.

Для обращения к полям данных динамического объекта из вне следует использовать конструкцию: <указатель на объект>-><имя поля>;

Для обращения к методу динамического объекта следует использовать следующую конструкцию: <указатель на объект класса>-><обращение к методу>;

 

Замечания:

1). В одном и том же методе мы можем использовать переменные с одним и тем же именем, но принадлежащие разным областям видимости;

2). С++ допускает раздельную компиляцию частей программы: можно определение класса разместить в отдельном файле, а главную функцию в другом файле, но при этом подключить файл с классом.

4 вопрос.

Определение конструктора. Форматы вызова конструктора.

Конструктор – это метод класса, который автоматически вызывается при объявлении (определении) объекта или при динамическом создании объекта.

Конструктор распределяет память под объект и инициализирует поля этого объекта.

 

Определение конструктора внутри класса:<имя класса>(<список формальных параметров>){<операторы>};

Формат вызова конструктора:

<имя класса><имя объекта>(<список параметров>);

 

Правила при работе с компилятором:

1). Имя конструктора должно совпадать с именем класса;

2). Не определяется тип возвращаемого объекта;

3). Может иметь несколько конструкторов с разными параметрами (перегрузка функций);

4). Параметры могут иметь любой тип кроме этого типа класса;

5). Компилятор создает его автоматически;

6). Конструкторы не наследуются.

5 вопрос.

Способы инициализации данных объекта с помощью конструктора.

Существует 2 способа:

1). Передача значений параметров в тело конструктора;

2). Перемещение списка инициализаторов данных объектов. Этот список помещается между списком параметров и телом конструктора.

 

Синтаксис определения конструктора:

<имя класса>(<список параметров>):<список инициализаторов>{<тело конструктора>};

6 вопрос.

Определение и вызов деструктора.

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

Если в классе не определен деструктор, компилятор создает его по умолчанию.

Формат описания деструктора:

~<имя класса>(){<операторы>};

 

Правила при работе с деструктором:

1). Имя должно совпадать с именем класса;

2). Не имеет возвращаемого значения;

3). Не имеет параметров;

4). Не может быть перегружен;

5). Вызов деструктора для уничтожения динамического объекта выполняется с помощью оператора delete.

7 вопрос.

Перегрузка конструкторов. Конструктор по умолчанию.

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

Например, 1-ый конструктор создает пустую строку, а 2-ой создает объект по заданной строке.

 

Если в классе нет конструктора, то компилятор предоставляет 2 конструктора – копирующий и по умолчанию.

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

8 вопрос.

Присваивание объектов.

Если 2 объекта имеют одинаковый тип, то есть они оба принадлежат одному классу, то один объект можно присвоить другому объекту.

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

9 вопрос.

Передача функциям объектов по значению. Побочные эффекты при передаче объектов по значению.

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

Передается не сам объект, а его побитовая копия, следовательно, изменения, внесенные в передаваемый объект при выполнении функции, не оказывают никакого влияния на него. При вызове функции создается копия и обычный конструктор не вызывается, вместо него вызывается конструктор копии. Если в классе нет конструктора копии, то компилятор предоставляет его автоматически.

Копирующий конструктор по умолчанию создает копию этого объекта, передаваемого функции, и эта копия становится параметром функции. При завершении функции вызывается деструктор, который разрушает копию объекта. Необходимость вызова деструктора связана с выходом локального объекта из области видимости.

 

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

Чтобы избежать такой ошибки можно передавать объект по ссылке. Однако, передача объектов по ссылке не всегда применима.

Можно создать собственный конструктор копии, который может корректно создать копию объекта.

10 вопрос.

Передача функциям объектов по ссылке.

В этом случае функции передается адрес объекта, и функция будет обрабатывать непосредственно объект, а не его копию. Изменения в объекте повлияют на аргумент (объект).

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

 

11 вопрос.

Возвращение функциями объектов. Побочные эффекты при возвращении функциями объектов.

Чтобы функции можно было вернуть объект как результат, нужно объявить в качестве ее типа имя соответствующего класса и обеспечить возвращение этого объекта через оператор return.

Если функция разрушает объекты, то автоматически создается временный объект, который хранит возвращенное значение.

Разрушение временного объекта может вызвать побочные эффекты. Кроме того, побочные эффекты могут возникать при инициализации одного объекта другим.

Необходимо создавать конструктор копии.

12 вопрос.

Определение и вызов конструктора копии.

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

В С++ существуют следующие правила работы с конструктором:

1). Имя должно совпадать с именем класса;

2). Нельзя определять тип возвращаемого для конструктора;

3). Класс может иметь несколько конструкторов или не иметь их совсем;

4). Конструктор может не иметь параметров.

 

Формат конструктора копии:

<имя класса>(const <имя класса>&<переменная>){<тело конструктора>}; где &<переменная> - ссылка на объект, который копируется.

 

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

13 вопрос.

Наследование. Определение базового и производного классов.

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

Синтаксис: class<имя производного класса>:<спецификатор доступа><имя базового класса>{<список элементов производного класса>};

 

Спецификаторы доступа:

1.public

Если базовый класс наследуется как открытый класс, то его открытые элементы остаются открытыми элементами, защищенные элементы–защищенными элементами, а закрытые элементы будут закрытыми элементами.

Защищенными являются элементы, которые открыты для производных классов, но закрыты вне иерархии классов.

2.private

Если базовый класс наследуется как private, то его защищенные и открытые элементы становятся закрытыми элементами.

3.protected

Если базовый класс наследуется как защищенный, то все его открытые и защищенные элементы становятся защищенными элементами.

 

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

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

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

14 вопрос.

Доступ к членам базовых и производных классов.

Производный класс не может получить доступ к закрытым элементам базового класса.

Решения этой проблемы:

1). Можно private присвоить protected;

2). Использовать определенные функции базового класса, позволяющие получить доступ к элементам.

15 вопрос.

Вызов конструкторов и деструкторов базового и производного классов при создании иерархии классов.

В иерархии классов как базовый, так и производный классы могут иметь конструкторы.

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

1). Если в базовом классе вообще нет конструктора или есть конструктор по умолчанию, производному классу конструктор нужен, только если требуется инициализировать поля, введенные в этот класс;

2). Если не определен ни один конструктор, то компилятор самостоятельно создаст конструктор по умолчанию, из которого будет вызван конструктор по умолчанию базового класса;

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

 

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

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

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

16 вопрос.

Множественное наследование. Определение класса при множественном наследовании.

Множественное наследование дает возможность создать производный класс на основе нескольких базовых. Производный класс может служить базовым классом. Такой набор связанных классов называется иерархией классов.

 

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

Синтаксис: class<имя класса>:<спецификатор><имя базового класса 1>,..,<спецификатор> <имя базового класса N>{<список элементов производного класса>};

 

Замечания:

1). При создании объекта производного класса сначала вызывается конструктор базового класса, а затем конструктор производного класса;

2). При разрушении объекта производного класса сначала вызывается его деструктор, а за ним деструктор базового класса;

3). Если некоторый класс наследует несколько базовых классов, то вызов конструкторов происходит слева направо, а деструкторов справа налево;

4). При множественном наследовании никакой класс не может больше 1-го раза использоваться в качестве непосредственного базового; чтобы устранить дублирование объекта непрямого базового класса при множественном наследовании этот базовый класс объявляют виртуальным;

5). Неоднозначность трактовки, необходимо не забывать указывать класс к которому принадлежит этот метод.

17 вопрос.

Динамическое распределение памяти под объекты. Операторы new и delete.

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

Доступ к динамическим объектам осуществляется не по именам, а по указателям.

 

Динамическая память – это оперативная память компьютера, предоставляемая программе в процессе ее выполнения.

Создание динамического объекта происходит в два этапа:

1). Резервирование места в ДП под объект и формирование значений указателей ссылающихся под этот объект;

2). Запись значений объекта в ДП по указанному адресу.

 

Для выделения места служит оператор new: <имя указателя>= new <тип данных>;

Оператор new выделяет в ДП место под значение указанного типа и возвращает адрес этой области. При использовании оператора new можно сразу инициализировать значении объекта в скобках. Аналогично можно выделить память под массив.

 

Для освобождения ДП служит оператор delete: delete[]<имя указателя>;

При перемещении объекта в ДП с помощью оператора new вызывается конструктор, а при освобождении деструктор.

18 вопрос.

Статические элементы класса. Описание и инициализация статических переменных. Способы доступа к статическим переменным. Статические функции.

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

Компилятор каждому имени в соответствии ставит адрес, в связи с этим доступ к статическим объектам реализуется по имени.

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

Например, static int a;

 

Обращение к статическому полю можно двумя способами:

1). <имя класса>::<имя элемента>;

2). <имя объекта>::<имя элемента>.

 

Если при описании класса статической переменной присвоить статус private, то компилятор выдаст сообщение о невозможности доступа к элементу. Обращаться в таком случае можно через статические методы.

Статическая функция обрабатывает только статические поля.

Синтаксис: <имя класса>::<обращение к статической функции>; <имя объекта>::<обращение к статической функции>.

19 вопрос.

Дружественные функции класса.

В языке С++ доступ к закрытым полям класса осуществляется с помощью методов, однако существует другой способ – с помощью функций, которые не принадлежат классу. Для этого достаточно объявить эту функцию дружественной, с помощью friend.

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

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

Функция может быть дружественной по отношению к нескольким классам. Для этого ее необходимо объявить в каждом классе.

20 вопрос.

Дружественные функции по отношению к нескольким классам. Дружественные классы.

Функция может быть дружественной по отношению к нескольким классам. Для этого ее необходимо объявить в каждом классе.

Дружественная функция одного класса может быть элементом другого класса.

Класс может быть дружественным для другого класса. В этом случае его методы будут дружественные для этого класса.

21 вопрос.

Полиморфизм. Статический полиморфизм.

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

В С++ полиморфизм основан на связывании идентификаторов методов с физическими адресами. Такое связывание может осуществляться 2-мя способами:

1). На этапе компиляции текста – механизм раннего связывания;

2). Во время выполнения программы – механизм позднего связывания.

 

Статический полиморфизм – это полиморфизм механизма раннего связывания.

Работа с объектами чаще всего происходит через указатели. Указатели на производные и базовые классы связаны особым отношением. Как правило, указатель не может ссылаться на объект другого типа, однако, указатель на базовый класс можно использовать.

Следует иметь в виду, что указатель на базовый класс можно использовать для доступа только к тем элементам, которые были наследованы.

22 вопрос.

Динамический полиморфизм. Виртуальные функции.

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

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

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

Правила работы с виртуальными функциями:

1). Виртуальная функция определяется в базовом классе и переопределяется в производных классах(автоматически становится виртуальной в производном классе);

2). Прототипы виртуальной функции и ее переопределение должны в точности совпадать;

3). Виртуальная функция должна быть методом класса, а не ее другом, но может быть другом для другого класса;

4). Если переопределить в производном классе, то объекты производного класса могут получить доступ к виртуальной функции базового класса;

5). Конструкторы не могут быть виртуальными;

6). Деструкторы могут быть виртуальными.

23 вопрос.

Механизм позднего связывания.

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

Компилятор встраивает в каждый объект скрытый указатель на соответствующую ему таблицу виртуальных методов (ТВМ). Фактически связывание объекта с ТВМ осуществляется в процессе выполнения программы с помощью конструктора. Если вызывается виртуальная функция, сгенерированный компилятором код находит указатель на ТВФ (функций) и извлекает из нее адрес соответствующих функций. При создании объекта производного класса вначале вызывается конструктор базового класса, определяется указатель на ТВФ соответствующего базового класса, при вызове производного класса указатель на ТВФ настраивается на переопределенный вариант виртуальной функции.

24 вопрос.

Чисто виртуальные функции и абстрактные классы.

Чисто виртуальная функция – функция, объявленная в базовом классе, но не имеющая в нем никакого определения, поэтому любой производный класс должен определить собственную версию этой функции.

Синтаксис:

virtual <тип><имя функции>(<список параметров>)=0;

где ‘=0’ – это признак чисто виртуальной функции.

 

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

 

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


Дата добавления: 2015-11-04; просмотров: 18 | Нарушение авторских прав




<== предыдущая лекция | следующая лекция ==>
 | 

mybiblioteka.su - 2015-2024 год. (0.037 сек.)