Пространства имён
Варианты
Действия

Default constructors

Материал из cppreference.com
< cpp‎ | language

 
 
Язык С++
Общие темы
Управление программой
Операторы условного выполнения
Операторы повторения
Операторы перехода
Функции
объявление функции
объявление лямбда-функции
шаблон функции
спецификатор inline
спецификаторы исключений (устарело)
спецификатор noexcept (C++11)
Исключения
Пространства имён
объявление пространства имён
псевдонимы пространства имён
Типы
спецификатор decltype (C++11)
Спецификаторы
cv-спецификаторы
спецификаторы продолжительности хранения
спецификатор constexpr (C++11)
спецификатор auto (C++11)
спецификатор alignas (C++11)
Инициализация
Литералы
Выражения
Утилиты
Типы
typedef-объявление
объявление псевдонима типа (C++11)
атрибуты (C++11)
Приведения типов
неявные преобразования
const_cast-преобразование
static_cast-преобразование
dynamic_cast-преобразование
reinterpret_cast-преобразование
C-подобное и функциональное приведение типов
Выделение памяти
Классы
Особые свойства классовых функций
Специальные функции-члены
Шаблоны
шаблон класса
шаблон функции
специализация шаблона
упакованные параметры (C++11)
Разное
Ассемблерные вставки
 
Конструктор по умолчанию является конструктором, который может быть вызван без аргументов (как определено с пустым списком параметров, или с параметрами по умолчанию предоставлена ​​для каждого параметра). Типа с общественностью конструктор по умолчанию является DefaultConstructible.
Оригинал:
A default constructor is a constructor which can be called with no arguments (either defined with an empty parameter list, or with default arguments provided for every parameter). A type with a public default constructor is DefaultConstructible.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

Содержание

[править] Синтаксис

ClassName ( ) ; (1)
ClassName :: ClassName ( ) body (2)
ClassName() = delete ; (3) (начиная с C++11)
ClassName() = default ; (4) (начиная с C++11)

[править] Объяснение

1)
Декларация конструктор по умолчанию
Оригинал:
Declaration of a default constructor
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
2)
Определение конструктора вне тела класса
Оригинал:
Definition of the constructor outside the class body
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
3)
Ингибирование автоматической генерации конструктора по умолчанию
Оригинал:
Inhibiting the automatic generation of a default constructor
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
4)
Явно заставляя автоматической генерации конструктора по умолчанию
Оригинал:
Explicitly forcing the automatic generation of a default constructor
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
ClassName является идентификатором включающего класса
Оригинал:
ClassName is the identifier of the enclosing class
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
По умолчанию конструкторы вызываются, если:
Оригинал:
The default constructors are called when:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • создание объектов или массивов статических, поточно-местные, и автоматический срок хранения, объявленные без инициализации, (T obj; или T arr[10];)
    Оригинал:
    creating objects or arrays of static, thread-local, and automatic storage duration that are declared without an initializer, (T obj; or T arr[10];)
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • создание объектов динамической срок хранения, когда новое выражение пишется без инициализатора (new T;)
    Оригинал:
    creating objects of dynamic storage duration when the new-expression is written without an initializer (new T;)
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • создание массивов динамических срок хранения с выражением new T[n]
    Оригинал:
    creating arrays of dynamic storage duration with the expression new T[n]
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • создания стоимости инициализации временных объектов с актерами выражение T().
    Оригинал:
    creating value-initialized temporary objects with the cast expression T().
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Неявно объявлен конструктор по умолчанию

Если нет пользовательского конструктора любого рода предназначены для классового типа (struct, class, или union), компилятор всегда будет объявлять конструктор по умолчанию, как inline public членом своего класса. Если некоторые пользовательские конструкторы присутствует, пользователь все еще может заставить поколения неявно объявляется конструктор с ключевым словом default (начиная с C++11).
Оригинал:
If no user-defined constructors of any kind are provided for a class type (struct, class, or union), the compiler will always declare a default constructor as an inline public member of its class. If some user-defined constructors are present, the user may still force the generation of the implicitly declared constructor with the keyword default (начиная с C++11).
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Удаленные неявно объявлен конструктор по умолчанию

Неявно объявлен дефолт или конструктор по умолчанию для класса T не определено (до C++11) / определяется как' (начиная с C++11) удален, если любое из следующих условий:
Оригинал:
The implicitly-declared or defaulted default constructor for class T is undefined (до C++11) / defined as deleted (начиная с C++11) if any of the following is true:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • T имеет член типа ссылки (без скобки или равно initializer(начиная с C++11)).
    Оригинал:
    T has a member of reference type (without a brace-or-equal initializer(начиная с C++11)).
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • T имеет const члена (без скобки или равно initializer(начиная с C++11)) или определенный пользователем конструктор по умолчанию.
    Оригинал:
    T has a const member (without a brace-or-equal initializer(начиная с C++11)) or a user-defined default constructor.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • T есть член (без скобки или равно initializer(начиная с C++11)), который имеет удаленный конструктор по умолчанию, или его конструктор по умолчанию является неоднозначной или недоступными из этого конструктора.
    Оригинал:
    T has a member (without a brace-or-equal initializer(начиная с C++11)), which has a deleted default constructor, or its default constructor is ambiguous or inaccessible from this constructor.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • T имеет прямое или виртуальные базы, которая имеется удален конструктор по умолчанию, или оно неоднозначно или недоступными из этого конструктора.
    Оригинал:
    T has a direct or virtual base which has a deleted default constructor, or it is ambiguous or inaccessible from this constructor.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • T имеет прямое или виртуальные базы, которая имеется удален деструктор, или деструктор, который недоступен из этого конструктора.
    Оригинал:
    T has a direct or virtual base which has a deleted destructor, or a destructor that is inaccessible from this constructor.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • T является union по крайней мере один вариант член с нетривиальным умолчанию constructor(начиная с C++11).
    Оригинал:
    T is a union with at least one variant member with non-trivial default constructor(начиная с C++11).
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • T в union и все его члены являются вариантом const.
    Оригинал:
    T is a union and all of its variant members are const.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Тривиальные конструктор по умолчанию

Неявно объявлен конструктор по умолчанию для класса T является тривиальной, если все следующие условия:
Оригинал:
The implicitly-declared default constructor for class T is trivial if all of the following is true:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • T не имеет виртуальных функций-членов
    Оригинал:
    T has no virtual member functions
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • T не имеет виртуальные базовые классы
    Оригинал:
    T has no virtual base classes
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • T не имеет нестатических членов скобки или равно инициализаторы (начиная с C++11)
    Оригинал:
    T has no non-static members with brace-or-equal initializers (начиная с C++11)
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Каждая прямая база T имеет тривиальный конструктор по умолчанию
    Оригинал:
    Every direct base of T has a trivial default constructor
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Каждый нестатический член класса типа имеет тривиальный конструктор по умолчанию
    Оригинал:
    Every non-static member of class type has a trivial default constructor
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Тривиальным конструктором по умолчанию конструктор, который не выполняет никаких действий. Объекты с тривиальным конструкторы по умолчанию может быть создан с помощью reinterpret_cast на любом носителе, например, на память, выделенную с std::malloc. Все типы данных, совместимые с языком C (POD типов) тривиально по умолчанию конструктивных.
Оригинал:
A trivial default constructor is a constructor that performs no action. Objects with trivial default constructors can be created by using reinterpret_cast on any storage, e.g. on memory allocated with std::malloc. All data types compatible with the C language (POD types) are trivially default-constructible.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Неявно определенный конструктор по умолчанию

Если неявно объявлен конструктор по умолчанию не удаляется и не тривиально, оно определено (то есть, тела функции создается и компилируется) компилятором, и он имеет точно такой же эффект, как определенный пользователем конструктор с пустым телом и пустой инициализатор список. То есть, он вызывает конструктор по умолчанию оснований и не статические члены этого класса.
Оригинал:
If the implicitly-declared default constructor is not deleted or trivial, it is defined (that is, a function body is generated and compiled) by the compiler, and it has exactly the same effect as a user-defined constructor with empty body and empty initializer list. That is, it calls the default constructors of the bases and of the non-static members of this class.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Пример

struct A {
    int x;
    A(int x = 1) : x(x) {} // user-defined default ctor
};
struct B : A {
    // B::B() is implicitly-defined, calls A::A()
};
struct C {
    A obj;
    // C::C() is implicitly-defined, calls A::A()
};
struct D : A {
    D(int y) : A(y) {}
    // D::D() is not declared because another constructor exists
};
struct E : A
{
    E(int y) : A(y) {}
    E() = default; // explicitly defaulted, calls A::A()
};
 
struct F {
    int& ref; // reference member
    const int c; // const member
    // Bad::Bad() is deleted
};
 
int main()
{
    A a;
    B b;
//  D d; // compile error
    E e;
//  F f; // compile error
}