
- •История развития языков программирования
- •Основные свойства объектно-ориентированных языков программирования
- •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. Элементы объектно-ориентированного анализа и объектно-ориентированного проектирования. Диаграмма объектов: назначение, отношение между объектами
26. Особенности копирования объектов
Копирование объектов программы на С++ происходит в 4 случаях:
Операция присваивания
При инициализации объектов того же типа (конструктор копий)
При инициализации параметров фактическими, при передаче параметров по значению.
При возврате объектов из функции при операторе return. В этом случае создается временный объект, который инициализируется значениями из оператора return с помощью конструктора копий.
class A
{ char *p;
int size;
public:
A(int s, const char *c)
{
p=new char(size s);
strcpy(c);
}
~A()
{
delete []p;
}
A & operator=(const A &a)
{
if(this!=&a)
{
delete []p;
p=new char[size=a.size];
strcpy(p,a.p);
}
return *this;
}
A(const A&)//конструктор копий
{
p=new char[size=a.size];
strcpy(p,a.p);
}
}
void main()
{
A a(10, “String 1”),b(12, “String 2”);
...
a=b;
A c(20, “String 3”);
A d=c;//в первом случае была операция присваивания, а в этом операция копирования
}
Если вы используете в качестве параметров ссылки, то никаких конструкторов копирования вызываться не будет.
27. Заготовка класса без наследников
Для того, чтобы избежать проблем, связанных с неправильным использованием копирования, рекомендуется каждый новый класс создавать на основе ниже, которой надо заменить имена и наполнить методы конкретным содержанием.
//заготовка класса без наследования
class XClass
{
OClass o;
public:
XClass();
XClass(const XClass f):obj(a.obj) {}
~XClass();
const XClass & operator=(const XClass f);
};
Заготовка класса с наследниками будет отличаться тем, что деструктор для класса с наследником должен быть виртуальным (virtual).
28. Пример вектора с неповерхностным копированием.
Существуют два основных подхода к реализации операции клонирования:
1. Поверхностное копирование означает, что переменные клонированного объекта содержат те же значения, что и переменные исходного объекта, и что все ссылки указывают на одинаковые объекты. Другими словами, при поверхностном копировании копируется только клонируемый объект, но не объекты, на которые он ссылается. И оригинал, и поверхностная копия ссылаются на одни и те же объекты.
2. Глубокое копирование означает, что переменные клонированного объекта содержат те же самые значения, что и переменные исходного объекта, исключая переменные, которые ссылаются на объекты. Теперь они ссылаются на копии тех объектов, на которые ссылается исходный объект. Другими словами, при глубоком копировании копируется клонируемый объект и те объекты, на которые он ссылается. Глубокая копия ссылается на копии тех объектов, на которые ссылается исходный объект.
Реализация глубокого копирования может быть очень сложной. Нужно будет принимать решение, делать глубокие или поверхностные копии косвенно копируемых объектов. Кроме того, необходимо очень осторожно обращаться с любыми циклическими ссылками.
Поверхностное копирование реализуется проще, так как все классы наследуют Метод clone класса Object, который легко это делает. Однако если класс объекта не реализует интерфейс Cloneable, то метод clone не будет работать. Если все объекты-прототипы, используемые программой, будут клонировать сами себя по методу поверхностного копирования, то, объявив интерфейс
PrototypelF как расширение интерфейса Cloneable, можно будет сэкономить время. Таким образом, все классы, реализующие интерфейс PrototypelF, будут реализовывать также интерфейс Cloneable.
Некоторые объекты, например потоки и сокеты, не могут просто копироваться или совместно использоваться. Какая бы стратегия копирования ни применялась, если имеются ссылки на такие объекты, то для использования скопированных объектов придется создавать эквивалентные объекты.