Namespaces
Variants

Classes

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Класс — это определяемый пользователем тип.

Тип класса определяется спецификатором класса, который появляется в decl-specifier-seq синтаксиса объявления . См. объявление класса для синтаксиса спецификатора класса.

Класс может содержать следующие виды членов:

1) члены данных:
2) функции-члены:
3) вложенные типы:
а) nested classes и enumerations определённые внутри определения класса
б) псевдонимы существующих типов, определяемые с помощью typedef или type alias (начиная с C++11) объявлений
c) имя класса в его собственном определении действует как псевдоним типа-члена с публичным доступом для целей поиска (за исключением случаев, когда оно используется для именования конструктора ): это известно как injected-class-name
4) enumerators из всех неограниченных перечислений, определенных внутри класса , или введенных с помощью using-declarations или using-enum-declarations (начиная с C++20)
5) member templates ( variable templates, (since C++14) class templates or function templates) могут появляться в теле любой нелокальной class/struct/union.

Все члены определяются сразу в определении класса, они не могут быть добавлены к уже определённому классу (в отличие от членов пространств имён)

Член класса T не может использовать T в качестве своего имени, если этот член является

  • статический член данных,
  • функция-член,
  • тип-член,
  • шаблон-член,
  • перечислитель перечисления (если перечисление не является областью видимости) (начиная с C++11) , или
  • член анонимного объединения-члена.

Однако нестатический элемент данных может использовать имя T до тех пор, пока не объявлены пользовательские конструкторы.

Класс, имеющий как минимум одну объявленную или унаследованную virtual функцию-член, является полиморфным . Объекты такого типа называются полиморфными объектами и содержат информацию о типе во время выполнения как часть представления объекта, которую можно запросить с помощью dynamic_cast и typeid . Виртуальные функции-члены участвуют в динамическом связывании.

Класс, содержащий как минимум одну объявленную или унаследованную чистую виртуальную функцию, является абстрактным классом . Объекты такого типа не могут быть созданы.

Класс с constexpr конструктором является LiteralType : объекты этого типа могут обрабатываться constexpr функциями во время компиляции.

(начиная с C++11)

Содержание

Свойства классов

Тривиально копируемый класс

Тривиально копируемый класс — это класс, который

Тривиальный класс

Тривиальный класс — это класс, который

(устарел в C++26)

Класс со стандартным размещением

Класс со стандартным размещением — это класс, который

  • не имеет нестатических членов данных типа класса не со стандартным размещением (или массива таких типов) или ссылки,
  • не имеет виртуальных функций и виртуальных базовых классов ,
  • имеет одинаковый контроль доступа для всех нестатических членов данных,
  • не имеет базовых классов не со стандартным размещением,
  • только один класс в иерархии имеет нестатические члены данных, и
  • Неформально: ни один из базовых классов не имеет тот же тип, что и первый нестатический член данных. Или формально: для данного класса S, не имеет элемента множества M(S) типов в качестве базового класса, где M(X) для типа X определяется как:
  • Если X является необъединенным классом без (возможно, унаследованных) нестатических членов данных, множество M(X) пусто.
  • Если X является необъединенным классом, у которого первый нестатический член данных имеет тип X0 (где этот член может быть анонимным объединением), множество M(X) состоит из X0 и элементов M(X0).
  • Если X является объединением, множество M(X) является объединением всех M(Ui) и множества, содержащего все Ui, где каждый Ui — тип i-го нестатического члена данных X.
  • Если X является массивом с типом элемента Xe, множество M(X) состоит из Xe и элементов M(Xe).
  • Если X является неклассовым, немассивным типом, множество M(X) пусто.

Структура со стандартным размещением — это класс со стандартным размещением, определённый с ключевым словом struct или ключевым словом class . Объединение со стандартным размещением — это класс со стандартным размещением, определённый с ключевым словом union .

(начиная с C++11)

Класс с неявным временем жизни

Неявно-временной класс — это класс, который

  • является агрегатом , деструктор которого не объявлен пользователем (до C++11) предоставлен пользователем (начиная с C++11) , или
  • имеет по крайней мере один тривиальный подходящий конструктор и тривиальный, неудалённый деструктор.

Примечание: свойство неявного времени жизни уточнено отчетом об ошибке P0593R6 .

POD класс

POD класс - это класс, который

  • является агрегатом ,
  • не имеет пользовательского оператора присваивания копированием,
  • не имеет пользовательского деструктора, и
  • не имеет нестатических членов данных типа non-POD класса (или массива таких типов) или ссылок.
(до C++11)
  • является тривиальным классом,
  • является классом со стандартным размещением, и
  • не имеет нестатических членов данных типа non-POD класса (или массива таких типов).
(начиная с C++11)

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 класс с неявным временем жизни мог иметь предоставленный пользователем деструктор запрещено