32. Ясно представляйте, какой вид класса вы создаете
32. Ясно представляйте, какой вид класса вы создаете
Резюме
Существует большое количество различных видов классов, и следует знать, какой именно класс вы создаете.
Обсуждение
Различные виды классов служат для различных целей и, таким образом, следуют различным правилам.
Классы-значения (например, std::pair, std::vector) моделируют встроенные типы. Эти классы обладают следующими свойствами.
• Имеют открытые деструктор, копирующий конструктор и присваивание с семантикой значения.
• Не имеют виртуальных функций (включая деструктор).
• Предназначены для использования в качестве конкретных классов, но не в качестве базовых (см. рекомендацию 35).
• Обычно размещаются в стеке или являются непосредственными членами другого класса.
Базовые классы представляют собой строительные блоки иерархии классов. Базовый класс обладает следующими свойствами.
• Имеет деструктор, который является либо открытым и виртуальным, либо защищенным и невиртуальным (см. рекомендацию 50), а также копирующий конструктор и оператор присваивания, не являющиеся открытыми (см. рекомендацию 53).
• Определяет интерфейс посредством виртуальных функций.
• Обычно объекты такого класса создаются динамически в куче как часть объекта производного класса и используются посредством (интеллектуальных) указателей.
Говоря упрощенно, классы свойств представляют собой шаблоны, которые несут информацию о типах. Класс свойств обладает следующими характеристиками.
• Содержит только операторы typedef и статические функции. Класс не имеет модифицируемого состояния или виртуальных функций.
• Обычно объекты данного класса не создаются (конструкторы могут быть заблокированы).
Классы стратегий (обычно шаблоны) являются фрагментами сменного поведения. Классы стратегий обладают следующими свойствами.
• Могут иметь состояния и виртуальные функции, но могут и не иметь их.
• Обычно объекты данного класса не создаются, и он выступает в качестве базового класса или члена другого класса.
Классы исключений представляют собой необычную смесь семантики значений и ссылок. При генерации исключений они передаются по значению, но должны перехватываться по ссылке (см. рекомендацию 73). Классы исключений обладают следующими свойствами.
• Имеют открытый деструктор и конструкторы, не генерирующие исключений (в особенности копирующий конструктор, генерация исключения в котором приводит к завершению работы программы).
• Имеют виртуальные функции и часто реализуют клонирование (см. рекомендацию 54).
• Предпочтительно делать их производными от std::exception.
Вспомогательные классы обычно поддерживают отдельные идиомы (например, RAII — см. рекомендацию 13). Важно, чтобы их корректное использование не было сопряжено с какими-либо трудностями и наоборот — чтобы применять их некорректно было очень трудно (например, см. рекомендацию 53).
Ссылки
[Abrahams01b] • [Alexandrescu00a] • [Alexandrescu00b] • [Alexandrescu01] §3 • [Meyers96] §13 • [Stroustrup00] §8.3.2, §10.3, §14.4.6, §25.1 • [Vandevoorde03] §15