A default constructor is a constructor which can be called with no arguments.
class-name (parameter-list (optional)); | (1) | |
class-name (parameter-list (optional)) function-body | (2) | |
class-name () = default; | (3) | (since C++11) |
class-name (parameter-list (optional)) = delete; | (4) | (since C++11) |
class-name ::class-name (parameter-list (optional)) function-body | (5) | |
class-name ::class-name () = default; | (6) | (since C++11) |
| class-name | - | the class whose default constructor is being declared |
| parameter-list | - | a parameter list where all paramters (except parameter packs)(since C++11) have default arguments |
| function-body | - | the function body of the default constructor |
Default constructors are called during default initializations and value initializations.
If no user-declared constructors of any kind are provided for a class type, the compiler will always declare a default constructor as an inline public member of its class.
| If some user-declared constructors are present, the user may still force the automatic generation of a default constructor by the compiler that would be implicitly-declared otherwise with the keyword default. | (since C++11) |
The implicitly-declared (or defaulted on its first declaration) default constructor has an exception specification as described in dynamic exception specification(until C++17) noexcept specification(since C++17).
If the constructor is implicitly-declared(until C++11)the implicitly-declared or explicitly-defaulted default constructor is not defined as deleted(since C++11), it is defined (that is, a function body is generated and compiled) by the compiler if odr-used or needed for constant evaluation(since C++11), and it has 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. Class types with an empty user-provided constructor may get treated differently than those with an implicitly-defined default constructor during value initialization.
| If this satisfies the requirements of a constexpr constructor(until C++23)constexpr function(since C++23), the generated constructor is constexpr. If some user-defined constructors are present, the user may still force the automatic generation of a default constructor by the compiler that would be implicitly-declared otherwise with the keyword default. | (since C++11) |
The implicitly-declared or explicitly-defaulted(since C++11) default constructor for class T is undefined(until C++11)defined as deleted(since C++11) if any of the following conditions is satisfied:
T is a union and all of its variant members are of const-qualified type (or possibly multi-dimensional array thereof). T is a non-union class and all members of any anonymous union member are of const-qualified type (or possibly multi-dimensional array thereof). T has a non-static data member of reference type without a default initializer(since C++11). T has a non-variant non-static non-const-default-constructible data member of const-qualified type (or possibly multi-dimensional array thereof) without a default member initializer(since C++11). T has a potentially constructed subobject of class type M (or possibly multi-dimensional array thereof) such that M has a destructor that is deleted or(since C++11) inaccessible from the default constructor, or
| (since C++11) |
M's default constructor | If no user-defined constructors are present and the implicitly-declared default constructor is not trivial, the user may still inhibit the automatic generation of an implicitly-defined default constructor by the compiler with the keyword delete. | (since C++11) |
The default constructor for class T is trivial (i.e. performs no action) if all of the following is true:
T has no virtual member functions. T has no virtual base classes.
| (since C++11) |
T has a trivial default constructor. A trivial default constructor is a constructor that performs no action. All data types compatible with the C language (POD types) are trivially default-constructible.
| A default constructor is eligible if it is either user-declared or both implicitly-declared and definable. | (until C++11) |
| A default constructor is eligible if it is not deleted. |
(since C++11) (until C++20) |
| A default constructor is eligible if
| (since C++20) |
Triviality of eligible default constructors determines whether the class is an implicit-lifetime type, and whether the class is a trivial type.
struct A
{
int x;
A(int x = 1): x(x) {} // user-defined default constructor
};
struct B : A
{
// B::B() is implicitly-defined, calls A::A()
};
struct C
{
A a;
// 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
// F::F() is implicitly defined as deleted
};
// user declared copy constructor (either user-provided, deleted or defaulted)
// prevents the implicit generation of a default constructor
struct G
{
G(const G&) {}
// G::G() is implicitly defined as deleted
};
struct H
{
H(const H&) = delete;
// H::H() is implicitly defined as deleted
};
struct I
{
I(const I&) = default;
// I::I() is implicitly defined as deleted
};
int main()
{
A a;
B b;
C c;
// D d; // compile error
E e;
// F f; // compile error
// G g; // compile error
// H h; // compile error
// I i; // compile error
}The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| CWG 1353 | C++98 | the conditions where implicitly-declared default constructors are undefined did not consider multi-dimensional array types | consider these types |
| CWG 2084 | C++11 | default member initializers had no effect on whether a defaulted default constructor of a union is deleted | they prevent the defaulted default constructor from being deleted |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/language/default_constructor