
- •1. Понятие модуля. Принципы модульного программирования. Понятие объекта как динамического модуля.
- •2. Понятие класса. Понятие метода. Представление метода в виде обычной процедуры. Понятие конструктора и деструктора.
- •3. Понятие свойства. Методы получения и установки значений свойств. Свойства-массивы (в некоторых языках программирования). Индексаторы (в некоторых языках программирования).
- •Информация о типе времени выполнения программы
- •5. Классы в программных модулях. Атрибуты доступа к элементам объектов. Термин «инкапсуляция».
- •Термин «инкапсуляция»
- •Virtual – в базовом классе
- •7. Понятие ссылки на метод объекта (или делегата – в зависимости от языка программирования). Понятие события. Применение ссылок на методы для расширения объектов.
- •8. Понятие метакласса (в некоторых языках программирования). Методы, применяемые к классам. Виртуальные конструкторы (в некоторых языках).
- •Понятие метакласса (в некоторых языках программирования)
- •Виртуальные конструкторы (в некоторых языках)
- •3) Finally – вызвать free.
- •Если глобально-уникальный идентификатор назначается интерфейсу, то он записывается после ключевого слова interface и заключается в квадратные скобки, например:
- •Microsoft Visual Studio
- •Import Network;
- •Var Stat: SocketStat;
- •Var SocketStatCollection: … ;
- •Конструкторы и деструкторы
- •Стандартные конструкторы
- •Создание объектов по значению (на стеке) и по ссылке (в динамической памяти)
- •Операторы new и delete
- •Размещающий оператор new
- •Порядок конструирования и разрушения объектов
- •Вложенные определения классов
- •«Друзья» класса
- •Статические члены класса
- •19. Перегрузка бинарных операторов. Перегрузка унарных операторов. Перегрузка операторов преобразования типа.
- •Индексаторы
- •Механизм вызова событий
- •Создание пользовательских обобщенных коллекций
- •Создание обобщенных интерфейсов
- •Несколько слов о вложенных делегатах
- •25. Понятие итератора в языке c#. Оператор foreach. Оператор yield.
- •И напоследок... Блок finally
- •26. Понятие атрибутов в языке c#. Создание пользовательских атрибутов. Анализ атрибутов во время выполнения программы. Понятие рефлексии (reflection) в языке c#. Сериализация объектов.
- •Что такое метаданные и зачем они нужны?
- •1. Метаданные в .Net обязательны и универсальны.
- •2. Метаданные в .Net общедоступны.
- •3. Метаданные в .Net исчерпывающи.
- •4. Метаданные в .Net расширяемы.
- •5. Метаданные в .Net конструируемы программно.
- •Получение экземпляра класса Type
- •Динамическая загрузка сборок
- •Динамическая загрузка типов
- •Исследование типа
- •Характеристики типа как целого
- •Члены класса
- •Исследование объекта
- •Динамическое создание объекта и вызов методов
- •Создание объекта по его типу
- •Декларативное программирование
- •Новые механизмы абстракции?
- •Динамическое создание типов
- •Роль графов объектов
- •Formatter сериализации
- •XmlSerializer
- •Интерфейсы iFormatter и iRemotingFormatter
- •Точность типов среди форматеров
- •28*. Ооп в языке программирования Smalltalk. Достоинства и недостатки этого языка в сравнениии с языком программирования c#.
Создание объектов по значению (на стеке) и по ссылке (в динамической памяти)
По значению (на стеке):
TTextReader reader;
По ссылке (в динамической памяти):
TTextReader * reader = new TTextReader(); //оператор new служит для размещения объекта в динамической памяти.
Таким способом объект создается по ссылке по указанному адресу памяти:
TTextReader*reader = new (адрес) TTextReader;
Разрушение объектов:
По значению (на стеке):
разрушение выполняется автоматически при выходе переменной за область видимости:
{
TTextReader reader;
...
} // здесь происходит разрушение объекта reader при автоматическом вызове деструктора
По ссылке (в динамической памяти):
должен быть уничтожен с помощью оператора delete:
delete reader;
При этом сначала происходит вызов деструктора, а затем – освобождение динамической памяти.
Операторы new и delete
Так выглядит динамическое создание и разрушение объектов:
new:
malloc();
TTextReader();
delete:
~TTextReader();
free();
Использование операций new и de1ete должно быть согласованным. Нужно сочетать операцию new с операцией delete, а new[] – с de1ete[] .
Если применяется несколько конструкторов, то все они должны использовать операцию new с одним и тем же синтаксисом - либо все со скобками, либо все без скобок. Поскольку существует только один деструктор, то все конструкторы должны быть совместимыми с ним. При этом допустимо инициализировать указатель с помощью операции new в одном конструкторе и с помощью нулевого указателя {NULL или О} – в другом, поскольку к нулевому указателю можно применять операцию de1ete ( со скобками или без них).
Производный класс не наследует конструкторы базового класса, поэтому нет смысла делать их виртуальными.
Размещающий оператор new
Обычно оператор new размещает объекты в динамической памяти (heap).
TDelimitedReader *R = new TDelimitedReader();
В данном случае оператор new имеет следующий вид:
void* operator new(size_t size);
Существует вид оператора new, который позволяет расположить объект по заданному адресу:
TDelimitedReader *R = new(Buffer) TDelimitedReader();
В этом же случае оператор new имеет следующий вид:
void* operator new(size_t size, void*p)
{
return p;
}
Комбинировать различные способы выделения и освобождения памяти не рекомендуется.
Порядок конструирования и разрушения объектов
По причине автоматичности конструкторов и деструкторов в С++ существует определенный порядок конструирования базовых и агрегированных объектов.
class TTextReader
{
public:
TTextReader();
~TTextReader();
}
class TDelimitedReader: public TTextReader
{
public:
TDelimitedReader();
~TDelimitedReader();
}
TDelimitedReader::TDelimitedReader()
{
...
}
TDelimitedReader::~TDelimitedReader()
{
...
}
В конструкторе производного класса конструктор базового класса вызывается автоматически до выполнения первого оператора в теле конструктора.
В деструкторе производного класса деструктор базового класса вызывается автоматически после последнего оператора в теле деструктора.
Если базовый класс содержит конструктор с параметрами или несколько конструкторов, то возникает неопределенность в том, какой конструктор базового класса будет вызван. Эту неопределенность можно устранить следующим образом:
TDelimitedReader::TDelimitedReader() : TTextReader(...)
// в скобках записываются параметры для вызова конструктора
{
...
}
После двоеточия разрешена запись списка операторов, разделенных запятыми. Эти операторы называются списком инициализации.
В С++ поддерживается множественное наследование. В этом случае конструктор базовых классов вызывается автоматически в порядке их упоминания в описании класса. Деструктор же базовых классов вызывается строго в обратном порядке.
Каждый конструктор перед началом своей работы инициализирует указатель vtable (в Delphi он называется VMT). Конструктор базового класса тоже инициализирует этот указатель. В результате этого объект как бы "рождается", сначала становясь экземпляром базового класса, а затем производного. Деструкторы выполняют противоположную операцию.
В результате этого в конструкторах и деструкторах виртуальные методы работают как невиртуальные.
Каждый конструктор перед началом своей работы укладывает в объекте ссылку на таблицу виртуальных методов – перед началом работы конструктора, т.е. самый базовый класс вкладывает в объект ссылку на таблицу виртуальных методов.
В других языках – первый вызванный конструктор укладывает ссылку на таблицу виртуальных методов. Следовательно, при вызове виртуального метода будет вызван метод производного класса.
По стандарту деструкторы и delete не имеют права бросать исключения.