Spec-Zone.ru › C++

Классы

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

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

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

1) данные членов:
a) нестатические данные членов, включая битовые поля.
b) статические данные членов
2) функции-члены:
a) нестатические функции-члены
b) статические функции-члены
3) вложенные типы:
a) вложенные классы и перечисления, определённые внутри определения класса
b) псевдонимы существующих типов, определённые с помощью typedef или псевдонима типа (с C++11)объявлений
c) имя класса внутри собственного определения выступает в качестве псевдонима типа public member для целей поиска (за исключением случаев, когда используется для именования конструктора): это известно как injected-class-name
4) перечислители из всех перечислений без области видимости, определённых внутри класса, или введённые с помощью using-объявлений или using-enum-объявлений(с C++20)
5) шаблоны-члены (шаблоны переменных, (с C++14)шаблоны классов или шаблоны функций) могут появляться в теле любого нелокального класса/структуры/объединения.

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

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

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

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

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

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

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

(с C++11)

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

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

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

  • имеет как минимум один подходящий конструктор копирования, конструктор перемещения, оператор копирующей присваивания или оператор перемещения присваивания,
  • каждый подходящий конструктор копирования является тривиальным
  • каждый подходящий конструктор перемещения является тривиальным
  • каждый подходящий оператор копирующей присваивания является тривиальным
  • каждый подходящий оператор перемещения присваивания является тривиальным, и
  • имеет не удалённый тривиальный деструктор.

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

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

  • является тривиально копируемым, и
  • имеет один или несколько подходящих конструкторов по умолчанию, причём каждый из них является тривиальным.

Класс стандартной компоновки

Класс стандартной компоновки — это класс, который

  • не имеет нестатических данных-членов типа класса нестандартной компоновки (или массива таких типов) или ссылки,
  • не имеет виртуальных функций и виртуальных базовых классов,
  • имеет одинаковый контроль доступа для всех нестатических данных-членов,
  • не имеет базовых классов нестандартной компоновки,
  • только один класс в иерархии имеет нестатические данные-члены, и
  • Неформально, ни один из базовых классов не имеет такого же типа, как первый нестатический член данных. Или, формально: для класса 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-класс — это класс, который

  • является агрегатом,
  • не имеет явно объявленного оператора копирующего присваивания,
  • не имеет явно объявленного деструктора и
  • не имеет нестатических данных-членов типа не-POD класса (или массива таких типов) или ссылки.
(до C++11)
  • является тривиальным классом,
  • является классом стандартной компоновки, и
  • не имеет нестатических данных-членов типа не-POD класса (или массива таких типов).
(с 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API