Default constructors
Материал из cppreference.com
![]() |
Эта страница была переведена автоматически с английской версии вики используя Переводчик Google.
Перевод может содержать ошибки и странные формулировки. Наведите курсор на текст, чтобы увидеть оригинал. Вы можете помочь в исправлении ошибок и улучшении перевода. Для инструкций перейдите по ссылке. Щёлкните здесь, чтобы увидеть английскую версию этой страницы |
Конструктор по умолчанию является конструктором, который может быть вызван без аргументов (как определено с пустым списком параметров, или с параметрами по умолчанию предоставлена для каждого параметра). Типа с общественностью конструктор по умолчанию является
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 ofT
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 }