Шпаргалка по "Программированию и компьютерам"
Шпаргалка, 27 Января 2012, автор: пользователь скрыл имя
Краткое описание
Работа содержит ответы на вопросы по дисциплине "Программирование и компьютеры"
Содержимое работы - 12 файлов
1 алгоритмич языки и программирование.doc
— 79.00 Кб (Открыть файл, Скачать файл)2 Технология программирования.doc
— 81.00 Кб (Скачать файл)virtual void Draw( ) = 0;
Для каждого класса, содержащего хотя бы один виртуальный метод, компилятор создает таблицу виртуальных методов (vtbl), в которой для каждого виртуального метода записан его адрес в памяти. Каждый объект содержит скрытое дополнительное поле ссылки на vtbl, называемое vptr. Оно заполняется конструктором при создании объекта. На этапе компиляции ссылки на виртуальные методы заменяются на обращения к vtbl через vptr, а на этапе выполнения в момент обращения к методу его адрес выбирается из таблицы.
Виртуальный механизм работает только при использовании указателей или ссылок на объекты.
Таким образом, при раннем связывании полиморфизм состоит в замещении метода, при позднем – в том, что при помощи одного и того же обращения к методу выполняются различные действия в зависимости от типа, на который ссылается указатель в каждый момент времени.
Класс,
содержащий хотя бы один чисто виртуальный
метод, называется абстрактным. Абстрактные
классы предназначены для представления
общих понятий, которые будут конкретизированы
в производных классах. Абстрактный класс
может использоваться только в качестве
базового для других классов. Объекты
базового класса создавать нельзя, т.к.
невозможен вызов чисто виртуальных методов.
4. Реализация наследования
в объектно-ориентированных языках программирования. Примеры.
Наследование обеспечивает возможность создания иерархии классов. Новый АТД может наследовать данные и некоторые функциональные свойства существующих АТД с модификацией этих свойств или добавлением новых составляющих. При этом существенно упрощается повторное использование, т.к. программист берет существующий тип и по его образцу создает новый, соответствующий задаче. Класс, который определен через наследование, называется производным (подклассом), класс, от которого производится новый тип – родительским (базовым, суперклассом).
В С++ при описании класса в его заголовке перечисляются все классы, являющиеся для него базовым (если их несколько, то они перечисляются через запятую). Возможность обращения к элементам этих классов регулируется с помощью ключей доступа private, protected и public:
class <имя> : [private | protected | public] <имя_базового_класса>
{ тело класса };
Кроме того, управления доступом введен дополнительный спецификатор protected, который предоставляет доступ производным классам к элементам, но запрещает доступ другим клиентам типа. Правила использования ключей и спецификаторов доступа приведены в таблице:
| Ключ доступа | Спецификатор базового класса | Доступ в производном классе |
| private | private
protected public |
private
private private |
| protected | private
protected public |
private
protected protected |
| public | private
protected public |
private
protected public |
Если базовый класс наследуется с ключом private, можно выборочно сделать некоторые его элементы доступными в производном классе, объявив их в секции public производного класса с помощью операции доступа к области видимости:
class CShape {… public: void Draw( ); };
class CCircle : private CShape {… public: CShape::void Draw( ); };
Рассмотрим правила наследования различных методов.
Конструкторы, деструкторы и операции присваивания не наследуются.
Порядок вызова конструкторов определяется следующими правилами
- Если в конструкторе производного класса явный вызов конструктора базового класса отсутствует, то автоматически вызывается конструктор базового класса по умолчанию.
- Для иерархии, состоящей из нескольких уровней, конструкторы базовых классов вызываются, начиная с самого верхнего уровня. После этого выполняются конструкторы тех элементов класса, которые являются объектами, в порядке их объявления в классе, а затем исполняется конструктор класса.
- В случае нескольких базовых классов их конструкторы вызываются в порядке объявления.
Правила наследования деструкторов
- Если деструктор не описан в подклассе, то он формируется по умолчанию и вызывает деструкторы всех базовых классов.
- Деструкторы вызываются в следующем порядке: деструктор класса, деструкторы элементов класса, деструктор базового класса.
Простым называется наследование, при котором производный класс имеет одного родителя. Множественное наследование означает, что класс имеет несколько базовых классов. Если в базовых классах есть одноименные элементы, то однозначно на них ссылаться можно только через разрешение области видимости. Например:
class A {… public: int GetVal();};
class B {… public: int GetVal();};
class C : public A, public B {…};
main{
C c;
int v = c.A::GetVal();
int w = c.B::GetVal();
…}
5. Реализация абстрактных структур данных в программировании: список, стек, дерево.
Пример реализации списка.
Линейный список – это динамическая структура данных для хранения множества элементов, для которых с помощью специальных адресов связи определено отношение следования. По виду взаимосвязи элементов различают однонаправленные, двунаправленные и кольцевые списки. Каждый элемент однонаправленного списка содержит указатель с адресом следующего элемента. Последний элемент имеет в указателе вместо адреса связи специальный знак – признак конца списка. Указатель списка содержит адрес его первого элемента. Если добавить в каждый элемент вторую ссылку – на предыдущий элемент, получится двунаправленный список, если последний элемент связать указателем с первым – кольцевой. Каждый элемент списка может содержать ключ, идентифицирующий этот элемент.
template <class Data> class CList
{
class Node {
public:
Data d;
Node *next, *prev;
Node() { next = NULL; prev = NULL;}
} *head, *tail;
public:
CList(){head = NULL; tail = NULL;}
~CList();
void push_front(Data d);
void push_back(Data d);
Node* find(Data d);
Node* insert(Data key, Data d);
bool remove(Data key);
void print();
};
Также на основе односвязного списка можно сформировать структуру Стека. Отличаться она будет тем, что удаление (pop) и вставка (push) идет только с одного конца списка (вершины, а противоположный конец - основание) (структура типа LIFO). Для него определены операции: показать элемент вершины, пуст ли стек, кол-во элементов.
Очередь
– структура в которой
template <class Type>
class Stack
{ private:
Type* stk_ptr;
int max_len;
int top;
public:
Stack (int size); //конструктор
Stack (); // конструктор по умолчанию
Stack (const Stack<Type> &L); //конструктор копирования
~Stack(); // деструктор
void push(Type element);// основные операции
void pop ();
Type stacktop();
int showtop(){return top;};
bool empty();
//перегрузка операции слож-я двух стеков (+)
Stack<Type>& operator + (Stack<Type> &L);
bool operator > (Stack<Type> &L); // перегрузка операции >
Type* info(){return stk_ptr;};
};
Деревья
– иерархическая структура