
- •Оглавление
- •1. Спецификация const для данных. Назначение.
- •2. Спецификация inline для функций. Назначение.
- •4. Ссылки. Назначение, обращение к данным по ссылке, использование ссылок для параметров функции и возвращаемого значения.
- •5. Динамическое создание и уничтожение объектов. Можно ли операции new и delete использовать вместе с malloc и free?
- •6. Динамическое создание и уничтожение массивов объектов.
- •8. Использование операции :: для доступа к элементам класса и глобальным функциям и переменным
- •9. Спецификации const для методов, не изменяющих объект. Спецификация mutable для элементов данных.
- •10. Дружественные функции и классы.
- •11. Статические переменные класса. Определение и инициализация.
- •12. Статические методы класса.
- •13. Указатель this. Назначение.
- •14. Конструктор: назначение, объявление (синтаксис), момент выполнения.
- •15. Конструктор: инициализация базовых классов и данных объекта через список инициализации в конструкторе.
- •16. Конструктор по умолчанию: объявление (синтаксис), назначение.
- •17. Конструктор копий: объявление (синтаксис), назначение.
- •18. Деструктор: назначение, объявление (синтаксис), момент выполнения.
- •19. Констукторы-преобразователи и операции для преобразования, способ вызова. Спецификация explicit для конструкторов-преобразователей.
- •20. Шаблоны функций: определение (синтаксис), назначение. Как вызвать функцию-шаблон?
- •21. Шаблоны классов (параметризация): определение (синтаксис), назначение. Как создать объект шаблонного класса?
- •22. Специализация шаблонов.
- •23. Библиотека stl. Общая характеристика.
- •24. Перегрузка функций и методов, основные правила связывания.
- •25. Правила перегрузки операций
- •26. Формат перегрузки унарных и бинарных операций как методов и [дружественных] функций.
- •28. Перегрузка операций присваивания: назначение, объявление (синтаксис), действия выполняемые в методе.
- •29. Перегрузка операций [] и () : назначение, объявление (синтаксис).
- •31. Перегрузка операций new и delete в классе: назначение, объявление (синтаксис).
- •32. Исключительные ситуации: назначение и стандартные искл. Ситуации (кроме stl).
- •33. Исключительные ситуации: порождение и перехват (синтаксис).
- •34. Исключительные ситуации: спецификация порождаемых исключительных ситуаций в заголовке функции.
- •36. Чисто виртуальные функции и абстрактные классы.
- •37. Простое наследование: определение, синтаксис. Порядок выполнения конструкторов и деструкторов. Вызов методов, переопределенных в производном классе, из базового класса.
- •39. Операция typeid. Rtti.
- •40. Операция безопасного преобразования данных const_cast. Назначение, синтаксис вызова.
- •41. Операция безопасного преобразования данных static_cast. Назначение, синтаксис вызова.
- •42.Операция безопасного преобразования данных dynamic_cast. Назначение, синтаксис вызова.
- •43. Операция безопасного преобразования данных reinterpret_cast. Назначение, синтаксис вызова.
- •44. Пространства имен: назначение, определение (синтаксис), варианты использования имен из namespace в своей программе.
- •45. Какие методы должны быть определены в классе с динамическим выделением памяти для некоторых элементов данных?
- •46. Сложность программного обеспечения.
- •47. Пять свойств сложной системы.
- •48. Основные методы при создании сложных систем.
- •49. Основные положения оо подхода.
- •50. Концепции оо подхода: Абстрагирование.
- •51. Концепции оо подхода: Ограничение доступа.
- •52. Концепции оо подхода: Модульность
- •53. Концепции оо подхода: Иерархия.
- •54. Концепции оо подхода: Типизация.
- •55. Концепции оо подхода: Параллелизм.
- •56. Концепции оо подхода: Устойчивость (сохраняемость).
- •57. Объекты в ооп: Определение объекта.
- •58. Объекты в ооп: Состояние.
- •59. Объекты в ооп: Поведение. Операции.
- •60. Объекты в ооп: Уникальность (идентичность).
- •61. Объекты в ооп: Отношения между объектами.
- •62. Классы в ооп: Понятие класса, связь между объектами и классами.
- •63. Отношения между классами: Ассоциации.
- •64. Отношения между классами: Наследование.
- •65. Отношения между классами: Агрегация.
- •66. Отношения между классами: Использование.
- •67. Отношения между классами: Конкретизация (параметризованные классы).
- •68. Отношения между классами: Метаклассы.
- •69. Паттерны проектирования: Абстрактная фабрика.
- •70. Паттерны проектирования: Одиночка.
- •71. Паттерны проектирования: Прототип (виртуальный конструктор).
- •72. Паттерны проектирования: Адаптер.
- •73. Паттерны проектирования: Заместитель.
- •74. Паттерны проектирования: Компоновщик.
- •75. Паттерны проектирования: Декоратор.
- •76. Паттерны проектирования: Итератор.
- •77. Паттерны проектирования: Шаблонный метод.
45. Какие методы должны быть определены в классе с динамическим выделением памяти для некоторых элементов данных?
Все поля и вспомогательные методы в class следует делать закрытыми или защищенными элементами. Для доступа к полям пользователям класса могут быть предоставлены тривиальные селекторы и модификаторы. Для запрета чтения или изменения некоторого поля соответствующий селектор или модификатор не определяется.
class A {
int value;
public:
int getValue() const { return value; } // тривиальный селектор
void setValue(int newValue) { value=newValue; } // тривиальный модификатор
};
Друзьями класса следует делать только операции этого класса. Прочие функции и классы должны использовать открытый интерфейс. Более того, некоторые операции могут быть реализованы через обычные функции, не являющиеся друзьями класса, если открытого интерфейса достаточно для их реализации. Методы и дружественные функции должны непосредственно обращаться к полям для получения их значений, а не через тривиальные селекторы. Более того, если какая-то операция класса, реализованная через обычную функцию, использует тривиальные селекторы для получения значений полей, необходимо сделать ее дружественной и обращаться к полям непосредственно. Необходимо минимизировать интерфейс класса. В набор операций необходимо включать те операции, которые нельзя эффективно реализовать через другие методы и функции. Методы, не изменяющие состояния объекта, должны быть объявлены как константные. Методы, изменяющие состояние объекта, не должны возвращать информацию о состоянии объекта (текущем или предыдущем). Взаимосвязанные поля (например, день и месяц в дате) должны устанавливаться вызовом одного метода. Если параметр не изменяется в теле функции, а его размер больше или равен 16 байт или он содержит указатель на динамически выделенную память, то его необходимо передавать как ссылку на константный объект. Иначе можно передавать по значению. Для классов с динамическим выделением памяти обязательно определяйте деструктор, конструктор копий и операцию присваивания или запретите их автоматическое создание компилятором. Объявляйте деструкторы виртуальными в классах, являющихся базовыми в иерархии. В объявлении класса определяйте только методы, состоящие из одного оператора присваивания или return.
46. Сложность программного обеспечения.
Сложность вызывается четырьмя основными причинами:
сложностью реальной предметной области, из которой исходит заказ на разработку;
трудностью управления процессом разработки;
необходимостью обеспечить достаточную гибкость программы;
неудовлетворительными способами описания поведения больших дискретных систем.
Сложность реального мира. Проблемы, которые мы пытаемся решить с помощью программного обеспечения, часто неизбежно содержат сложные элементы, а к соответствующим программам предъявляется множество различных, порой взаимоисключающих требований. У пользователей и разработчиков разные взгляды на сущность проблемы, и они делают различные выводы о возможных путях ее решения. Знакомство с первыми версиями системы позволяет пользователям лучше понять и отчетливей сформулировать то, что им действительно нужно. В то же время процесс разработки повышает квалификацию разработчиков в предметной области и позволяет им задавать более осмысленные вопросы, которые проясняют темные места в проектируемой системе.
Трудности управления процессом разработки. Основная задача разработчиков состоит в создании иллюзии простоты, в защите пользователей от сложности описываемого предмета или процесса. Сегодня обычными стали программные системы, размер которых исчисляется десятками тысяч или даже миллионами строк на языках высокого уровня. Ни один человек никогда не сможет полностью понять такую систему. Поэтому такой объем работ потребует привлечения команды разработчиков. Чем больше разработчиков, тем сложнее связи между ними и тем сложнее координация, особенно если участники работ географически удалены друг от друга.
Гибкость программного обеспечения. Программирование обладает предельной гибкостью, и разработчик может сам обеспечить себя всеми необходимыми элементами, относящимися к любому уровню абстракции. Такая гибкость чрезвычайно соблазнительна. Она заставляет разработчика создавать своими силами все базовые строительные блоки будущей конструкции, из которых составляются элементы более высоких уровней абстракции. В отличие от строительной индустрии, где существуют единые стандарты на многие конструктивные элементы и качество материалов, в программной индустрии таких стандартов почти нет. Кроме того, часто приходится выполнять настройку программы под индивидуальные требования конкретного пользователя и системное окружение. Поэтому программные разработки остаются очень трудоемким делом.
Проблема описания поведения больших дискретных систем. Аналоговые системы, такие, как движение брошенного мяча, напротив, являются непрерывными. Небольшие изменения входных параметров всегда вызовут небольшие изменения выходных. С другой стороны, дискретные системы по самой своей природе имеют конечное число возможных состояний. Мы стараемся проектировать системы, разделяя их на части так, чтобы одна часть минимально воздействовало на другую. Каждое событие, внешнее по отношению к программной системе, может перевести ее в новое состояние, и, более того, переход из одного состояния в другое не всегда детерминирован. Всеобъемлющее тестирование таких программ провести невозможно. При неблагоприятных условиях небольшое внешнее событие может привести к критической ошибке системы.
Чем сложнее система, тем легче ее полностью развалить.