2026-04-20 (3VO): C++ Intro =========================== From :doc:`/trainings/material/soup/cxx/cxx03/020-data-encapsulation/index`: * :doc:`/trainings/material/soup/cxx/cxx03/020-data-encapsulation/c` * :doc:`/trainings/material/soup/cxx/cxx03/020-data-encapsulation/cpp-introduction` * :doc:`/trainings/material/soup/cxx/cxx03/020-data-encapsulation/ctor-custom` * :doc:`/trainings/material/soup/cxx/cxx03/020-data-encapsulation/ctor-default` Spickzettel ----------- Original C .......... .. literalinclude:: code/2026-04-20--point-cpp/main.c :language: c++ :caption: :download:`code/2026-04-20--point-cpp/main.c` Constructor ........... * Don't leave anything uninitialized * ``this``? Currently only used to disambiguate between two versions of ``x``. .. literalinclude:: code/2026-04-20--point-cpp/main-ctor.cpp :language: c++ :caption: :download:`code/2026-04-20--point-cpp/main-ctor.cpp` Default Constructor ................... * People want ``point p;`` to have a defined outcome * |longrightarrow| default constructor .. literalinclude:: code/2026-04-20--point-cpp/main-default-ctor.cpp :language: c++ :caption: :download:`code/2026-04-20--point-cpp/main-default-ctor.cpp` Non ``const`` Method: ``move()`` ................................ * ``move()`` *modifies* a ``point`` * *Explicit* first parameter becomes *implicit* ``this`` .. literalinclude:: code/2026-04-20--point-cpp/main-method-move.cpp :language: c++ :caption: :download:`code/2026-04-20--point-cpp/main-method-move.cpp` ``const`` Method: ``abs()`` ........................... * Does not modify a point * |longrightarrow| ``const`` method .. literalinclude:: code/2026-04-20--point-cpp/main-method-abs.cpp :language: c++ :caption: :download:`code/2026-04-20--point-cpp/main-method-abs.cpp` Access Specifiers: ``public`` And ``private`` ............................................. **Use case**: nobody should be able to fiddle with members ``x`` and ``y`` in an uncontrolled way! A ``class`` definition may have access specifiers: * ``public``: members visible to outside (default for ``struct``) * ``protected``: members visible to derived classes |longrightarrow| a sign of *implementation inheritance* (discouraged) * ``private``: members only visible to other members of same class (default for ``class``) |longrightarrow| *access methods* * Let's remove the explicit ``this``, btw. .. literalinclude:: code/2026-04-20--point-cpp/main-public-private.cpp :language: c++ :caption: :download:`code/2026-04-20--point-cpp/main-public-private.cpp` Separate Compilation Units .......................... * Class definition may contain method implementations * Expanded inline when called (entire code copied to caller) * Not space friendly for large methods * |longrightarrow| Put into separate compilation unit *and generate a real call* .. literalinclude:: code/2026-04-20--point-cpp/main-modular.cpp :language: c++ :caption: :download:`code/2026-04-20--point-cpp/main-modular.cpp` .. literalinclude:: code/2026-04-20--point-cpp/point.h :language: c++ :caption: :download:`code/2026-04-20--point-cpp/point.h` .. literalinclude:: code/2026-04-20--point-cpp/point.cpp :language: c++ :caption: :download:`code/2026-04-20--point-cpp/point.cpp`