Default constructors
A default constructor is a constructor which can be called with no arguments.
Contents |
Syntax
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 parameters (except parameter packs ) (since C++11) have default arguments |
| function-body | - | the function body of the default constructor |
Explanation
Default constructors are called during default initializations and value initializations .
Implicitly-declared default constructor
If there is no user-declared constructor or constructor template for a class type, the compiler will implicitly declare a default constructor as an inline public member of its class.
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) .
Implicitly-defined default constructor
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 implicitly-defined by the compiler when odr-used or needed for constant evaluation or when it is explicitly defaulted after its first declaration (since C++11) .
|
If a default constructor of a
union-like class
|
(since C++26) |
An (until C++26) Otherwise, an (since C++26) implicitly-defined default constructor 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) |
Deleted default constructor
The implicitly-declared or explicitly-defaulted default constructor for class
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) |
Trivial default constructor
The default constructor for class
T
is trivial if all following conditions are satisfied:
- The constructor is implicitly-declared (until C++11) not user-provided (since C++11) .
-
Thas no virtual member functions. -
Thas no virtual base classes.
|
(since C++11) |
-
Every direct base of
Thas a trivial default constructor.
|
(until C++26) |
|
(since C++26) |
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.
Eligible default constructor
|
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 all following conditions are satisfied:
|
(since C++20) |
Triviality of eligible default constructors determines whether the class is an implicit-lifetime type , and whether the class is a trivially copyable type .
Notes
| Feature-test macro | Value | Std | Feature |
|---|---|---|---|
__cpp_trivial_union
|
202502L
|
(C++26) | Relaxing the triviality requirements for special member functions of unions |
Example
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 }
Defect reports
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++11 |
the conditions where implicitly-declared default constructors are
defined as deleted did not consider multidimensional 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 |
| CWG 2595 | C++20 |
a default constructor was not eligible if there is
another default constructor which is more constrained but does not satisfy its associated constraints |
it can be eligible in this case |
| CWG 2871 | C++98 |
a default constructor would be implicitly declared
even if there is a user-declared constructor template |
no implicit declaration
in this case |