.. ot-topic:: cxx03.data_encapsulation.ctor_default :dependencies: cxx03.data_encapsulation.ctor_custom .. include:: Default Constructor =================== .. contents:: :local: Compiler Generated Default Constructor -------------------------------------- .. admonition:: **Rule** A default constructor is automatically generated by the compiler *when no user defined constructors are present in the class*. That constructor *default-initializes* all members. .. literalinclude:: code/c++03-default-ctor-compiler-generated.cpp :caption: :download:`code/c++03-default-ctor-compiler-generated.cpp` :language: c++ .. code-block:: console $ ./code/c++03-default-ctor-compiler-generated sth.s: "" sth.ints.size(): 0 Compiler Generated Default Constructor: Pitfall: Built-In Types --------------------------------------------------------------- .. caution:: **Built-in datatypes (e.g. integers) are not initialized** This one reads uninitialized memory from the stack ... .. literalinclude:: code/c++03-default-ctor-compiler-generated-pitfall.cpp :caption: :download:`code/c++03-default-ctor-compiler-generated-pitfall.cpp` :language: c++ .. code-block:: console $ ./code/c++03-default-ctor-compiler-generated-pitfall sth.i: 666 **Solution**: write default constructor *manually*!! Manually Written Default Constructor ------------------------------------ **C++ pre 11** .. code-block:: c++ class Something { public: Something() : i(0) {} // <--- explicit initialization int i; }; **C++11 onwards** .. code-block:: c++ class Something { public: int i{}; // <--- default value specified in member definition }; What If User-Defined Constructors Are In Place? ----------------------------------------------- * No default constructor is generated * |longrightarrow| user has to supply one (if desired) **C++ pre 11** .. code-block:: c++ class Something { public: Something() : i(0) {} // <--- user supplied default ctor Something(int value) : i(value) {} // <--- user defined ctor int i; }; **C++11 onwards** .. code-block:: c++ class Something { public: Something() = default; // <--- force default ctor generation Something(int value) : i(value) {} // <--- user defined ctor int i{}; // <--- default value specified in member definition };