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
.
Syntax
ClassName ( ) ; | (1) | |
ClassName :: ClassName ( ) body | (2) | |
ClassName() = delete ; | (3) | (since C++11) |
ClassName() = default ; | (4) | (since C++11) |
Explanation
ClassName
is the identifier of the enclosing class.
Default constructors are called during default initializations and value initializations.
Implicitly-declared default constructor
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 automatic generation of a default constructor by the compiler that would be implicitly-declared otherwise with the keyword default . | (since C++11) |
Implicitly-defined default constructor
If the implicitly-declared default constructor is not defined as deleted, 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.
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 implicitly-declared default constructor
The implicitly-declared or defaulted default constructor for class T
is undefined (until C++11)defined as deleted (since C++11) if any of the following is true:
-
T
has a member of reference type without a default initializer. (since C++11) -
T
has aconst
member without user-defined default constructor or a default initializer (since C++11). -
T
has a member (without a default initializer) (since C++11) which has a deleted default constructor, or its default constructor is ambiguous or inaccessible from this constructor. -
T
has a direct or virtual base which has a deleted default constructor, or it is ambiguous or inaccessible from this constructor. -
T
has a direct or virtual base which has a deleted destructor, or a destructor that is inaccessible from this constructor.
| (since C++11) |
-
T
is aunion
and all of its variant members areconst
.
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 (i.e. performs no action) if all of the following is true:
- The constructor is not user-provided (i.e., is implicitly-defined or defaulted)
-
T
has no virtual member functions -
T
has no virtual base classes
| (since C++11) |
- Every direct base of
T
has a trivial default constructor - Every non-static member of class type has a trivial default constructor
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 suitably aligned storage, e.g. on memory allocated with std::malloc
. All data types compatible with the C language (POD types) are trivially default-constructible.
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 }; int main() { A a; B b; C c; // D d; // compile error E e; // F f; // compile error }
Please login to continue.