- •1. Комментарии
- •2. Константы
- •3. Встраиваемые функции Встраиваемые функции
- •4. Объявление структур, объединений и перечислений
- •5. Объявление переменных
- •5. Ссылки Что такое ссылка и что с ней можно делать
- •Ссылку можно рассматривать как еще одно имя объекта. В основном ссылки используются для задания параметров и возвращаемых функциями значений, а также для перегрузки операций.
- •6. Использование спецификатора void
- •7. Преобразование стандартных типов данных.
- •8. Новые операции new, delete, операция расширения области видимости
- •1. Операция new
- •2. Операция delete
- •3. Операция :: области видимости
- •9. Объявление функций. Аргументы по умолчанию
- •10. Перегрузка функций
- •Когда использовать перегрузку
- •Новые возможности по сравнению с Си
- •Объектно-ориентированные особенности языка
- •Две роли классов
- •Поля класса
- •Конструкторы класса
- •13. Перегрузка операций
- •Перегрузка операций
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Перегрузка операции приведения типа
- •14. Дружественные функции
- •15. Сходства и различия классов, структур и объединений.
- •Отличия структур и объединений от классов
- •16. Классы и объекты. Определение класса и области видимости. Опережающее объявление класса
- •Две роли классов
- •Поля класса
- •17. Использование спецификатора класса памяти static. Статические компоненты класса
- •18. Константные объекты и константные методы
- •19. Неявный указатель this
- •20. Указатели на член класса
- •21. Локальные и вложенные классы
- •22. Специальный вид методов класса - конструкторы и деструкторы. Некоторые особенности конструкторов и деструкторов Конструкторы класса
- •23. Классы, содержащие объекты других классов
- •24. Создание объектов с различным временем жизни
- •25. Массивы объектов класса
- •26. Особенности копирования объектов Конструктор копирования
- •27. Заготовка класса без наследников
- •28. Пример вектора с неповерхностным копированием.
- •29. Излишнее копирование. Конструктор копии. Операции присваивания.
- •1. Излишнее копирование
- •2. Конструктор копирования
- •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. Элементы объектно-ориентированного анализа и объектно-ориентированного проектирования. Диаграммы классов. Отношения классов: ассоциация, наследование, агрегация, использование.
- •51. Элементы объектно-ориентированного анализа и объектно-ориентированного проектирования. Диаграммы объектов, назначения, отношения между объектами. Диаграммы объектов (object diagrams)
3. Операции присваивания
При отсутствии переопределения операции присваивания производится побайтное копирование объектов. Такая интерпретация операции присваивания некорректна, если объект имеет указатели на динамические переменные или массивы, идентификаторы связанных ресурсов и т.д. При копировании таких объектов необходимо сначала уничтожить связанные динамические переменные и ресурсы левого операнда, а затем заново резервировать, но уже с параметрами, необходимыми для интерпретации операции присваивания.
Присваивание – это тоже операция, она является частью выражения. Значение правого операнда присваивается левому операнду.
x = 2; // переменной x присвоить значение 2
cond = x < 2; // переменной cond присвоить значение true, если x меньше 2,
// в противном случае присвоить значение false
3 = 5; // ошибка, число 3 неспособно изменять свое значение
Последний пример иллюстрирует требование к левому операнду операции присваивания. Он должен быть способен хранить и изменять свое значение. Переменные, объявленные в программе, обладают подобным свойством. В следующем фрагменте программы
int x = 0;
x = 3;
x = 4;
x = x + 1;
вначале объявляется переменная x с начальным значением 0. После этого значение x изменяется на 3, 4 и затем 5. Опять-таки, обратим внимание на последнюю строчку. При вычислении операции присваивания сначала вычисляется правый операнд, а затем левый. Когда вычисляется выражение x + 1, значение переменной x равно 4. Поэтому значение выражения x + 1 равно 5. После вычисления операции присваивания (или, проще говоря, после присваивания) значение переменной x становится равным 5.
У операции присваивания тоже есть результат. Он равен значению левого операнда. Таким образом, операция присваивания может участвовать в более сложном выражении:
z = (x = y + 3);
В приведенном примере переменным x и z присваивается значение y + 3.
Очень часто в программе приходится значение переменной увеличивать или уменьшать на единицу. Для того чтобы сделать эти действия наиболее эффективными и удобными для использования, применяются предусмотренные в Си++ специальные знаки операций: ++ (увеличить на единицу) и -- (уменьшить на единицу). Существует две формы этих операций: префиксная и постфиксная. Рассмотрим их на примерах.
int x = 0;
++x;
Значение x увеличивается на единицу и становится равным 1.
--x;
Значение x уменьшается на единицу и становится равным 0.
int y = ++x;
Значение x опять увеличивается на единицу. Результат операции ++ – новое значение x, т.е. переменной y присваивается значение 1.
int z = x++;
Здесь используется постфиксная запись операции увеличения на единицу. Значение переменной x до выполнения операции равно 1. Сама операция та же – значение x увеличивается на единицу и становится равным 2. Однако результат постфиксной операции – это значение аргумента до увеличения. Таким образом, переменной z присваивается значение 1. Аналогично, результатом постфиксной операции уменьшения на единицу является начальное значение операнда, а префиксной – его конечное значение.
Подобными мотивами оптимизации и сокращения записи руководствовались создатели языка Си (а затем и Си++), когда вводили новые знаки операций типа "выполнить операцию и присвоить". Довольно часто одна и та же переменная используется в левой и правой части операции присваивания, например:
x = x + 5;
y = y * 3;
z = z – (x + y);
В Си++ эти выражения можно записать короче:
x += 5;
y *= 3;
z -= x + y;
Т.е. запись oper= означает, что левый операнд вначале используется как левый операнд операции oper, а затем как левый операнд операции присваивания результата операции oper. Кроме краткости выражения, такая запись облегчает оптимизацию программы компилятором.