initialisierungsliste



  • Ich habe kein Problem damit Initialisierungslisten anzuwenden aber
    Ich habe eine Frage:

    Wo liegt jetzt genau der Laufzeitvorteil von Initialisierungslisten?

    Persönlich finde ich es nämlich schade dass meine Konstruktoren meistens leer sind weil alles davor in der Initialisierungsliste steht, nur ab und an hab ich da ne funktion wie init() stehen

    irgendwie beunruhiogt mich das, wenn auch wahrscheinlich grundlos



  • Wenn dus nicht initialisierst verschwendest du theoretisch in wenig Zeit, weil der Konstruktor je nach Typ das die Daten füllt oder manchmal auch nicht (undefiniert, zufällige werte).
    Es ist ratsam Initialisierungslisten zu bevorzugen.



  • greetz schrieb:

    Persönlich finde ich es nämlich schade dass meine Konstruktoren meistens leer sind weil alles davor in der Initialisierungsliste steht

    Ohh... 😞 😉

    Der Laufzeitvorteil ergibt sich erst bei komplexeren Typen, bei denen die Instanz zuerst standardkonstruiert und nachher zugewiesen wird, anstatt sie direkt zu initialisieren. Wohl ist die Initialisierungsliste aber unter gewissen Bedingungen nicht nur vorteilhaft, sondern notwendig:

    • Die Klasse enthält const -qualifizierte Objekte als Membervariablen.
    • Die Klasse enthält Referenzen.
    • Einige der Member unterstützen aus anderen Gründen keine Zuweisungs-Semantik.
    • Gewisse Member oder Basisklassen besitzen keinen zugänglichen Standardkonstruktor.

    ProInitLIst schrieb:

    Es ist ratsam Initialisierungslisten zu bevorzugen.

    Genau. Natürlich gibt es Ausnahmen, aber im Allgemeinen fährt man mit der Initialisierungsliste gut.

    Edit: Fall hinzugefügt



  • wenn du in der Klasse ein Member (oder eine Basisklasse) hast, die keinen Default-Ctor hat, dann muss es in der initliste konstruiert werden.
    Wenn der member einen Default-Ctor hat und du erst im Ctor-Body einen Wert zuweist, dann geschieht folgendes:

    1. Das Objekt wird initialisiert und der default-Ctor des Member wird aufgerufen.
    2. Bei der Wertzweisung wird der zuzuweisende Wert konstruiert (ein zweites Objekt vom selben Typ) und der operator= aufgerufen.

    Das ist eindeutig mehr Aufwand als gleich bei der initialisierung den richtigen Konstruktor aufzurufen 😉


Anmelden zum Antworten