2008-2003 экзамен (из методички) (1161195), страница 2
Текст из файла (страница 2)
B::f
B::g
B::h
A::h
B::f
B::g
B::h
B::h
-----
C::f
C::g
A::h
C::f
C::g
B::h
2. Ада 83, Ада 95, Delphi, C#
3. Конструкция языка Delphi «uses список_имен_модулей» служит для импорта всех имен, объявленных в интерфейсе модулей из списка. При этом импортированные имена становятся непосредственно видимыми (если нет конфликтов с именами из других модулей).
Конструкция языка Ада «use список_имен_пакетов» обеспечивает непосредственную видимость имен из спецификаций пакетов из списка (если
нет конфликтов).
Сходство: конструкции обеспечивают непосредственную видимость имен из интерфейсов (спецификаций) при отсутствии конфликтов.
Различие: в Delphi «uses» импортирует имена из интерфейсов библиотечных модулей, в Аде импорт имен обеспечивается другими конструкциями, а «use» служит только для разрешения непосредственной видимости.
4. Си++.
Пример динамического массива в языке Java (или C#):
void f(int N) {
byte [] dynArray = new byte [N];
// ...обработка ...
}
Замечание: в языках Оберон и Модула-2 длина формальных параметров — открытых массивов является динамическим атрибутом. В других случаях длина массива — статический атрибут. В Аде формальные параметры неограниченных типов-массивов также имеют динамический атрибут-длину (равно как и динамические массивы-локальные переменные).
5. Семантика возобновления: после обработки исключения управление может вернуться непосредственно в точку, где возникло исключение (варианты: на следующий оператор или на любой оператор из того же блока). Пример языка: Visual Basic.
Семантика завершения: после возникновения исключения блок, в котором оно возникло, обязательно завершается. Обработка исключения происходит в блоках, вызвавших блок с исключением. Пример языка: Си++.
6. В языке Ада 83 подпрограммы не могут быть параметрами подпрограмм (еще пример: Java).
7. Классы памяти: статическая; квазистатическая; динамическая.
В языке C# объекты классов размещаются только в динамической памяти.
8. Один из вариантов:
template <typename T, int size> class Stack
{
public:
Stack() {top = 0;}
void Push(T x);
T Pop(T& x);
bool IsEmpty();
bool IsFull();
private:
Stack (const Stack& s);
T body[N];
int top;
};
3.2. Вариант 2004
1.
X::f
X::g
X::g
Y::f
Y::g
Y::f
------------------------------
Y::f
X::g
Z::f
Y::g
Z::f
2. Ада 95, Си++, Оберон-2, Java, Delphi, C#.
3. Полностью эквивалентный фрагмент написать нельзя, поскольку Ада требует полной инкапсуляции структуры типа, а Оберон позволяет открывать поля структуры (в примере - I открыто, а J – закрыто). Однако можно на Аде написать написать подпрограммы доступа для I (get/set) и добиться того же эффекта.
type T is tagged private;
type T1 is new tagged T with private;
procedure P(X:T; L: integer);
procedure P(X:T1; L: integer);
Замечание: на языке Оберон процедуры P динамически привязаны к типу (T и T1 соответственно), однако на Аде динамическая привязка — это свойство не метода, а вызова. Поэтому разницы между динамически и статическими привязанными методами в Аде нет.
4. Ада, Delphi, C#
Язык C#:
try {
// блок try
...
} finally {
// блок finally
...
}
Блок finally обязательно выполнится после завершения блока try независимо от того, нормально или аварийно (с возбуждением исключения) произойдет это завершение.
5. Класс S имеет два конструктора:
– явно описанный explicit S(int);
– сгенерированный конструктор копирования S(const S&);
Замечание: конструктор умолчания не генерируется, так как в классе
есть явно описанный конструктор.
6. Конструкция package имеет вид:
package имя_пакета;
Она может быть только первой в единице компиляции. Смысл состоит в том, что класс, описанный в единице компиляции, относится к указанному пакету. Пакет является единицей дистрибуции Java-классов, а также единицей контекста.
7. Тип, имя которого экспортируется, но все поля — закрыты (не экспортируются).
TYPE OpaqueT* = RECORD I:TT; J: TTT END;
8.
void f()
{
try {
g(); h();
} catch (E1){
throw;
} catch (E2){
throw;
} catch (E3){
throw;
} catch (...) {
unexpected();
}
}
3.3. Вариант 2005
1.
A::f
A::g
A::g
B::f
B::g
20
B::f
------------------------------
B::f
A::g
C::f
B::g
C::f
2. Семантика возобновления: после обработки исключения управление может вернуться непосредственно в точку, где возникло исключение (варианты: на следующий оператор или на любой оператор из того же блока).
В языке Си++ реализована другая семантика: завершения, но в некоторых случаях семантика возобновления может быть смоделирована, например, в случае выделения возобновляемого ресурса (типа динамической памяти):
Resource GetResource() {
for (;;)
try {
Resource r = … // попытка получить ресурс, например
// выделить память
if (success) return r;
throw NoResourceException();
} catch (NoResourceException) {
// попытка найти дополнительные ресурсы (например,
// динамически собрать мусор)
if (!success) throw;
}
}
3. Язык Ада (реализация в виде двунаправленного списка):
generic
type T is private;
package G_Deque is
type Deque is limited private;
procedure PushRight(Deq: inout Deque; X:T);
procedure PushLeft(Deq: inout Deque; X:T);
procedure PopRight(Deq: inout Deque; X: out T);
procedure PopLeft(Deq: inout Deque; X: out T);
procedure Init(Deq: out Deque);
procedure Destroy(Deq: inout Deque);
function IsFull(Deq: Deque);
function IsEmpty(Deq: Deque);
–- другие процедуры ...
private
type PLink is access;
type Link is record inf : T; next, prev : PLink; end record;
type PLink is access Link;
type Deque is record Left, Right: PLink; end record;
end G_Deque;
21
Язык Java;
interface IDeque<T>
{
void PushLeft(T x);
void PushRight(T x);
T PopLeft();
T PopRight();
bool IsFull();
bool IsEmpty();
// другие функции
}
Замечания:
а). Обобщенные конструкции употреблять не обязательно (надо только написать, что тип Т должен быть непосредственно видимым в точке описания типа Deque). Хотя обобщения здесь подходят больше.
б). Структуру типа в Аде полностью выписывать необязательно. Главное — указать наличие приватной части, например:
private
...
type Deque is …; –- структура типа Deque
end G_Deque;
в). Для языка Java можно выписать не инетерфейс, а конкретный класс с приватной структурой и публичными функциями-операциями. Тела функций в этом случае можно не выписывать. Но интерфейс в данном случае больше подходит к понятию абстрактного типа данных.
4. Языки;
Ада 95, Си++, Java, Delphi, C#
Например, в языке Си++ абстрактная функция — это чистая виртуальная функция. Она не обязана иметь тела и должна быть обязательно замещена в каком-либо производном классе.
5. Ключевое слово super означает в языке Java ссылку на базовый класс. Такое же понятие есть в языке C#, но оно называется base.
Пример на Java:
class A
{
public A(int I) { … }
...
}
class B extends A
{
public B() { super(0); … }
...
}
Пример на C#:
class A
{
public A(int I) { … }
...
}
class B : A
{
public B() : base(0) { … }
...
}
6. Delphi, C#
«Свойство» - это член класса, который с точки зрения обращения к нему выглядит как член-данное, но с точки зрения реализации представлен двумя методами, один из которых возвращает значение свойства, а второй — устанавливает его значение. При этом один из методов может отсутствовать, делая недоступной соответствующую операцию над свойством.
Пример для языка Delphi – целое свойство Prop:
type PropSample = class
…
private
procedure SetPropVal(V : integer);
function GetPropVal:integer;
public
property Prop: integer read SetPropVal write GetPropVal;
…
end;
7. Ада 83, Ада 95, Си++, Java, Delphi, C#
Понятие «перегрузка» означает, что одному имени в одной области видимости может соответствовать несколько определений. В современных языках программирования перегружаться могут только имена подпрограмм, но не типов, переменных, модулей.
8. Основное отличие деструктора языка C# от деструктора Си++ состоит в том, что неизвестен момент его вызова. Деструктор (в действительности — финализатор) вызывается сборщиком мусора в момент утилизации памяти, занимаемой объектом. Для ряда объектов деструктор вообще может быть не вызван. В Си++ момент вызова деструктора достаточно точно определен.
3.4. Вариант 2006
1. Ада, Модула-2, Паскаль
Объединение типов (или запись с вариантами) — это конструкция, объединяющая в один тип несколько различных структур (вариантов). Все варианты в объединении начинаются с одного адрес и занимают одну и ту же память.
Размеченное объединение типов содержит одно выделенное поле (дискретного типа данных) — общее для всех вариантов. Такое поле называется дискриминантом. Значение дискриминанта определяет определяет, по какому варианту выделена память в переменной-экземпляре размеченного объединения.
2. Указатели языка Ада 83 ссылаются только на объекты из динамической памяти. Указатель языка Си++ может ссылаться на любой объект данных (динамический, локальный, статический), что может приводить к труднообнаружимым ошибкам. Также в языке Ада отсутствует адресная арифметика (арифметические операции над указателями), что также уменьшает вероятность появления ошибки работы с памятью.
3. Си, Си++
Раздельная трансляция означает то, что программа разбивается на части — физические модули или единицы компиляции. Каждая единица может или обязана транслироваться отдельно от остальных. Независимая раздельная трансляция означает то, что транслятор не обладает информацией об уже оттранслированных единицах и поэтому не может проверить корректность межмодульных связей.
4. Конструкция where используется в языке C# для определения ограничений на параметры родовых (другое название - обобщенных) конструкций.
Ее вид: where имя_типа : список_ограничений.
Виды ограничений:
– интерфейс — означает, что параметр-тип должен реализовывать этот интерфейс;
– имя класса (может быть только одно такое ограничение в списке) — означает, что параметр-тип должен быть наследником этого класса;
– struct или class – означает, что параметр-тип должен быть структурой или классом;
– new() - означает, что параметр-тип должен иметь конструктор умолчания (без параметров).
5.
11212
3 3
1 1 2 2
2 2 2 2
2 2 3 3
6. Си++, Ада 83, Ада 95, Visual Basic, C#, Delphi
Пример для языка Delphi:
if ptr = nil then
raise Exception.Create('Invalid pointer');
7. Конкретизация на языке Си++:
Matrix<float> b,c;
…
Matrix<float> a = MatMult(b,c);
Язык Ада:
generic
type T is private;
with function “+”(x,y:T) return T (<>);
with function “*”(x,y:T) return T (<>);
type Matrix is private;
function G_MatMult(A,B: Matrix) return Matrix;
8. Объекты классов языка Си++ могут быть размещены в статической, квазистатической, динамической памяти.
3.5. Вариант 2007
1. Семантика возобновления при обработке исключений состоит в том, что после обработки исключения управление может вернуться непосредственно в точку, где возникло исключение (варианты: на следующий оператор или на любой оператор из того же блока, где возникло исключение). В перечисленных в условии языках используется другая семантика: завершения, либо вообще отсутствует понятие реакции на исключение.