- •История развития языков программирования
- •Основные свойства объектно-ориентированных языков программирования
- •6. Использование спецификатора void
- •Преобразование стандартных типов данных.
- •Новые операции new, delete, операция расширения области видимости
- •Объявление функций. Аргументы по умолчанию
- •Перегрузка функций
- •Новые возможности по сравнению с Си
- •Объектно-ориентированные особенности языка
- •13. Перегрузка операций
- •14. Дружественные функции
- •15. Сходства и различия классов, структур и объединений.
- •Отличия структур и объединений от классов
- •16. Классы и объекты. Определение класса и области видимости. Опережающее объявление класса
- •17. Использование спецификатора класса памяти static. Статические компоненты класса
- •18. Константные объекты и константные методы
- •19. Неявный указатель this
- •20. Указатели на член класса
- •21. Локальные и вложенные классы
- •22. Специальный вид методов класса - конструкторы и деструкторы.
- •23. Классы, содержащие объекты других классов
- •24. Создание объектов с различным временем жизни
- •25. Массивы объектов класса
- •26. Особенности копирования объектов
- •27. Заготовка класса без наследников
- •28. Пример вектора с неповерхностным копированием.
- •29. Излишнее копирование. Конструктор копии. Операции присваивания.
- •1. Излишнее копирование
- •Конструктор копирования
- •3. Операции присваивания
- •30. Преобразование типов. Стандартные преобразования. Явное преобразование типов
- •Преобразования указателей и ссылок
- •Явные преобразования типов
- •Неявное преобразование типа
- •31. Преобразования абстрактных типов данных (преобразование типов данных, созданных программистом)
- •32. Наследование классов
- •33. Доступ к наследуемым членам класса
- •34. Стандартные преобразования типов при наследовании
- •35. Инициализация объекта порожденного класса. Конструктор копии. Операция присваивания.
- •3. Операции присваивания
- •37. Виртуальные функции. Объявления виртуальных функций. Чисто виртуальные функции
- •Методы(функции)
- •38. Таблица виртуальных функций. Случаи, когда вызов виртуальной функции не будет виртуальным. Виртуальные деструкторы
- •39. Ввод-вывод файлов. Потоки ввода-вывода. Библиотека ввода-вывода (iostream). Группы классов библиотеки ввода вывода
- •40. Краткая характеристика иерархии классов производных от conbuf.
- •Класс conbuf (constrea.H)
- •Функции-элементы
- •41. Иерархия классов производных от ios
- •42. Состояния потока. Ошибки потоков.
- •С каждым потоком связан набор флагов, которые управляют форматированием потока. Они представляют собой битовые маски, которые определены в классе ios как данные перечисления. Манипуляторы
- •Шаблоны и наследование. Шаблоны и конфигурация компиляторов. Достоинства и недостатки шаблонов.
- •Применение try, catch, throw
- •47. Обработка исключительных ситуаций. Обработка завершения. Обработка структурных исключений, заявление исключения, фильтрующие выражение. Исключительные ситуации
- •Обработка исключительных ситуаций
- •48. Стратегии взаимодействия объектов в программе. Программа как система взаимодействующих объектов. Система объектов, управляемых сообщениями
- •1. Программа, как система взаимодействия объектов.
- •49. Элементы объектно-ориентированного анализа и объектно-ориентированного проектирования. Диаграммы классов. Отношения классов: ассоциация, наследование, агрегация, использование.
- •50. Элементы объектно-ориентированного анализа и объектно-ориентированного проектирования. Диаграмма объектов: назначение, отношение между объектами
- •51. Элементы объектно-ориентированного анализа и объектно-ориентированного проектирования. Диаграмма объектов: назначение, отношение между объектами
6. Использование спецификатора void
Тип void (пустой) синтаксически ведет себя как основной тип. Однако использовать его можно только как часть производного типа, объектов типа void не существует. Он используется для того, чтобы указать, что функция не возвращает значения, или как базовый тип для указателей на объекты неизвестного типа.
void f() // f не возвращает значение
void* pv; // указатель на объект неизвестного типа
Переменной типа void* можно присваивать указатель любого типа. На первый взгляд это может показаться не особенно полезным, поскольку void* нельзя разыменовать, но именно это ограничение и делает тип void* полезным. Главным образом, он применяется для передачи указателей функциям, которые не позволяют сделать предположение о типе объекта, и для возврата из функций нетипизированных объектов. Чтобы использовать такой объект, необходимо применить явное преобразование типа. Подобные функции обычно находятся на самом нижнем уровне системы, там, где осуществляется работа с основными аппаратными ресурсами. Например:
void* allocate(int size); // выделить
void deallocate(void*); // освободить
f() {
int* pi = (int*)allocate(10*sizeof(int));
char* pc = (char*)allocate(10);
//...
deallocate(pi);
deallocate(pc);
}
Преобразование стандартных типов данных.
1.Неявное преобразование
2.Явное преобразование int(i)/int(j)
В языке С использовалась операция приведения типов следующего вида:
“(“имя типа”)”выражение
Наряду со старой формой операции приведения типов в С++ введен новый формат:
имя типа “(”выражение”)”
a = (double)b;
a = double (b); //функциональная форма
Новый формат не может быть использован, если имя состоит из нескольких слов.
Новые операции new, delete, операция расширения области видимости
Язык С++ имеет все операции языка С, но есть и дополнительные.
Операция расширения области видимости – язык С++ имеет мощную структуру, т.е. одно и то же имя может обозначать различные объекты, в зависимости от вложенности блоков. При этом правила следующие: объявление идентификатора во внутреннем блоке перекрывает соответствующее объявление в охватывающем блоке, а также и глобальное объявление, если оно есть.
“: :” – данная операция позволяет обратиться к глобальным переменным, если последняя перекрывается локальной переменной.
#include <stdio.h>
int i=1;
void main(void)
{
int i=10;
{
int i=100;
printf(“%d %d”,i,::i);
}
printf(“%d %d”,i,::i);
}
Эта операция нарушает значения ввода, поэтому использовать ее надо крайне осторожно.
Операции расширения динамической памяти – в языке С работать с динамической памятью можно было лишь через соответствующие функции распределения памяти, которые громоздкие и требовали ручной работы. В связи с этим, а также из-за специфики создания новых типов данных, в С++ введены новые операции: new и new[] для выделения памяти и delete и delete[] для удаления. С помощью new можно выделить для одиночного элемента, а с помощью new[] для массива. В случае успеха результатом операции будет адрес выделенного блока памяти. В случае неудачи: в старых версиях компилятора будет выделено значение 0, для современных компиляторов будет инициирована исключительная ситуация и программа аварийно остановится.
double *pd = new double;
double *a = new double[20];
double &dr = new double; //ошибка, т.к. new возвращает double
double &dr = *new double;
delete pd;
delete [] a;
delete &dr;
Следует отметить, что для освобождения массива данных надо всегда пользоваться операцией delete[]. Для встроенных типов данных разницы нет, но для данных, определяемых программистом, могут быть неприятности, связанные с отсутствием вызова специальных функций, называемых деструктор. В реальных системах операция new может выделить не более 64 кб памяти. Для функции освобождения нельзя пытаться освободить уже освобожденную область памяти.
