Classes
Класс — это определяемый пользователем тип.
Тип класса определяется спецификатором класса, который появляется в decl-specifier-seq синтаксиса объявления . См. объявление класса для синтаксиса спецификатора класса.
Класс может содержать следующие виды членов:
typedef
или
type alias
(начиная с C++11)
объявлений
Все члены определяются сразу в определении класса, они не могут быть добавлены к уже определённому классу (в отличие от членов пространств имён)
Член класса
T
не может использовать
T
в качестве своего имени, если этот член является
- статический член данных,
- функция-член,
- тип-член,
- шаблон-член,
- перечислитель перечисления (если перечисление не является областью видимости) (начиная с C++11) , или
- член анонимного объединения-члена.
Однако нестатический элемент данных может использовать имя
T
до тех пор, пока не объявлены пользовательские конструкторы.
Класс, имеющий как минимум одну объявленную или унаследованную
virtual
функцию-член, является
полиморфным
. Объекты такого типа называются
полиморфными объектами
и содержат информацию о типе во время выполнения как часть представления объекта, которую можно запросить с помощью
dynamic_cast
и
typeid
. Виртуальные функции-члены участвуют в динамическом связывании.
Класс, содержащий как минимум одну объявленную или унаследованную чистую виртуальную функцию, является абстрактным классом . Объекты такого типа не могут быть созданы.
|
Класс с constexpr конструктором является LiteralType : объекты этого типа могут обрабатываться constexpr функциями во время компиляции. |
(начиная с C++11) |
Содержание |
Свойства классов
Тривиально копируемый классТривиально копируемый класс — это класс, который
Класс со стандартным размещениемКласс со стандартным размещением — это класс, который
Структура со стандартным размещением — это класс со стандартным размещением, определённый с ключевым словом struct или ключевым словом class . Объединение со стандартным размещением — это класс со стандартным размещением, определённый с ключевым словом union . |
(начиная с 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 | класс с неявным временем жизни мог иметь предоставленный пользователем деструктор | запрещено |