Классы
Класс — это определяемый пользователем тип.
Тип класса определяется спецификатором класса, который встречается в decl-specifier-seq синтаксиса объявления. Синтаксис спецификатора класса см. в разделе объявление класса.
Класс может содержать следующие виды членов:
typedef или объявлений псевдонимов типов (начиная с C++11)Все члены определяются одновременно в определении класса; их нельзя добавить в уже определённый класс (в отличие от членов пространств имён).
Член класса T не может использовать T в качестве имени, если этот член является
- статическим данным-членом,
- функцией-членом,
- типом-членом,
- шаблоном-членом,
- перечислителем перечисления (если только перечисление не является ограниченным)(начиная с C++11), или
- членом анонимного объединения, являющегося членом класса.
Однако нестатический данные-член может использовать имя T, если нет объявленных пользователем конструкторов.
Класс, имеющий хотя бы одну объявленную или унаследованную виртуальную функцию-член, является полиморфным. Объекты этого типа являются полиморфными объектами и содержат информацию о типе во время выполнения как часть представления объекта; её можно запросить с помощью dynamic_cast и typeid. Виртуальные функции-члены участвуют в динамическом связывании.
Класс, имеющий хотя бы одну объявленную или унаследованную чисто виртуальную функцию-член, является абстрактным классом. Объекты этого типа нельзя создавать.
| Класс с конструктором constexpr является литеральным типом: объектами этого типа можно манипулировать с помощью функций constexpr во время компиляции. | (начиная с C++11) |
Свойства классов
Тривиально копируемый классТривиально копируемый класс — это класс, который
Класс со стандартной компоновкойКласс со стандартной компоновкой — это класс, который
Структура со стандартной компоновкой — это класс со стандартной компоновкой, определённый с ключевым словом класса | (начиная с C++11) |
Класс с неявным временем жизни
Класс с неявным временем жизни — это класс, который
- является агрегатом, деструктор которого не является объявленным пользователем(до C++11)предоставленным пользователем(начиная с C++11), или
- имеет хотя бы один тривиальный подходящий конструктор и тривиальный неудалённый деструктор.
Примечание: свойство неявного времени жизни уточнено в отчёте об исправлении дефекта P0593R6.
POD-классPOD-класс — это класс, который
POD-структура — это POD-класс, не являющийся объединением. POD-объединение — это объединение, являющееся POD-классом. | (устарело в C++20) |
Отчёты об исправлениях дефектов
Следующие отчёты об исправлениях дефектов, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Применён к | Поведение согласно опубликованному стандарту | Корректное поведение |
|---|---|---|---|
| CWG 148 | C++98 | POD-классы не могли содержать указатели на члены, которые сами являются POD-типами (скалярными типами) | ограничение снято |
| CWG 383 | C++98 | операторы присваивания копированием или деструкторы могли быть объявлены пользователем в POD-классах, если они не определены | не допускается |
| CWG 1363 | C++11 | класс, имеющий одновременно тривиальные и нетривиальные конструкторы по умолчанию, мог быть тривиальным | он является нетривиальным |
| CWG 1496 | C++11 | класс, имеющий только конструкторы, все определённые как удалённые, мог быть тривиальным | он является нетривиальным |
| CWG 1672 | C++11 | класс мог быть классом со стандартной компоновкой, если у него несколько пустых базовых классов | он не является классом со стандартной компоновкой |
| CWG 1734 | C++11 | тривиально копируемый класс не мог иметь нетривиальные удалённые конструкторы копирования/перемещения или операторы присваивания | может быть тривиальным, если они удалены |
| CWG 1813 | C++11 | класс никогда не был классом со стандартной компоновкой, если у него был базовый класс, наследующий нестатический данные-член | он может быть классом со стандартной компоновкой |
| CWG 1881 | C++11 | в классе со стандартной компоновкой и его базовых классах безымянные битовые поля могли объявляться в другом классе, объявляющем данные-члены | все нестатические данные-члены и битовые поля должны быть впервые объявлены в одном и том же классе |
| CWG 1909 | C++98 | шаблон-член мог иметь то же имя, что и его класс | запрещено |
| CWG 2120 | C++11 | при определении класса со стандартной компоновкой определение M(X) не учитывало случай, когда первый член класса является массивом | этот случай учтён в определении M(X) |
| CWG 2605 | C++98 | у класса с неявным временем жизни мог быть деструктор, предоставленный пользователем | запрещено |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/language/classes