Классы
Класс — это тип, определённый пользователем.
Тип класса определяется спецификатором класса, который появляется в последовательности спецификаторов объявления синтаксиса объявления. См. объявление класса для синтаксиса спецификатора класса.
Класс может иметь следующие виды членов:
typedef или псевдонима типа (с C++11)объявленийВсе члены определяются сразу в определении класса, их нельзя добавить к уже определённому классу (в отличие от членов пространств имён)
Член класса T не может использовать T в качестве своего имени, если этот член является
- статическим данными члена,
- функцией-членом,
- типом-членом,
- шаблоном-членом,
- перечислителем перечисления (если перечисление не имеет области видимости)(с C++11), или
- членом анонимного объединения-члена.
Однако, нестатический член данных может использовать имя T, при условии, что нет явно объявленных конструкторов.
Класс, содержащий хотя бы одну объявленную или унаследованную виртуальную функцию-член, является полиморфным. Объекты этого типа являются полиморфными объектами и содержат информацию о типе во время выполнения, хранящуюся в составе представления объекта, которую можно получить с помощью dynamic_cast и typeid. Виртуальные функции-члены участвуют в динамической привязке.
Класс, содержащий хотя бы одну объявленную или унаследованную чисто виртуальную функцию-член, является абстрактным классом. Объекты этого типа не могут быть созданы.
| Класс с constexpr конструктором является LiteralType: объекты этого типа могут обрабатываться constexpr функциями во время компиляции. | (с C++11) |
Свойства классов
Тривиально копируемый классТривиально копируемый класс — это класс, который
Тривиальный классТривиальный класс — это класс, который
Класс стандартной компоновкиКласс стандартной компоновки — это класс, который
Структура стандартной компоновки — это класс стандартной компоновки, определённый с ключевым словом | (с C++11) |
Класс с неявным сроком жизни
Класс с неявным сроком жизни — это класс, который
- является агрегатом, деструктор которого не явно объявлен(до C++11)пользовательским(с C++11), или
- имеет как минимум один тривиальный подходящий конструктор и тривиальный, не удалённый деструктор.
Примечания: свойство неявного срока жизни уточнено отчётом о дефекте P0593R6.
POD-класс
POD-класс — это класс, который
| (до C++11) |
| (с C++11) |
POD-структура — это не объединённый POD-класс. POD-объединение — это объединение, являющееся POD-классом.
| Использование свойства POD устарело. Коды пользователей должны ожидать или требовать свойства тривиального или стандартной компоновки, или оба. | (с C++20) |
Отчёты о дефектах
Следующие поведенческие отчёты о дефектах были применены ретроактивно к ранее опубликованным стандартам C++.
END_OF_DOCUMENT_MARKER| 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/w/cpp/language/classes