[C++ von { bis }] 11 - Konstruktoren & Destruktor

Поділитися
Вставка
  • Опубліковано 14 гру 2024

КОМЕНТАРІ • 17

  • @baldebaldemord9588
    @baldebaldemord9588 6 років тому +1

    Sehr gute Videos! Eine Verständnisfrage hätte ich aber: Findet der Compiler den passenden Konstruktor wieder anhand der mitgegebenen Variablen, so wie es beim überladen von Funktionen passiert?

    • @bytesnobjects
      @bytesnobjects  6 років тому

      Korrekt. Aus Sicht von C++ sind Funktionsname (und der Konstruktor ist nix anderes, als eine spezielle Funktion ohne Rückgabetyp, die halt nur unter bestimmten Umständen aufgerufen wird) und Parameterliste eins bzgl. der Identifikation der Funktion. Man sieht das sogar direkt, wenn man sich mit dem Thema "Name Mangling" befasst, wo der Compiler die Typen der Parameter in den internen Namen der Funktion einbaut, damit er die unterschiedlichen Überladungen auf Assemblerebene auseinanderhalten kann.

  • @JawsFG_
    @JawsFG_ 5 років тому

    Sees. Sauberes Video. Nur 1 Frage: was sind die Konvertierungskonstruktoren?

  • @tobiaskarl4939
    @tobiaskarl4939 6 років тому

    ... Wenn kein Konstruktor vorhanden ist, wird ein impliziter Standard Konstruktor erzeugt. Dieser initialsiert die Membervariablen...
    Bei mir reserviert er zwar Speicher für die Variable zB int x, aber diese hat einen zufälligen Wert, nicht etwa 0.
    Oder habe ich was falsch gemacht ?

    • @bytesnobjects
      @bytesnobjects  6 років тому

      Nope, alles in bester Ordnung. C und C++ sollen quasi nichts "kosten", was man nicht bestellt hat. Dazu gehört auch die Initialisierung von Variablen. Da liegt dann halt als Wert rum, was gerade an der Stelle im Speicher war.

  • @pm4598
    @pm4598 7 років тому

    Eine Frage Paramerliste und Initialisierungsliste kennst du da dne Unterschied???

    • @bytesnobjects
      @bytesnobjects  7 років тому +1

      Parameterlisten sind die Dinger in den runden Klammern, in denen die Parameter einer Methode/eines Konstruktors stehen. Initialisierungslisten sind nur hinter der Deklaration eines Konstruktors zulässig (die Dinger hinter dem : nach der Parameterliste des Konstruktors). Die geben an, wie die Felder und Basisklassen eines Objektes zu initialisieren sind, _bevor_ der Konstruktor selbst betreten wird.

  • @Noerfi
    @Noerfi 9 років тому

    Mir fällt gerade auf, dass immer std::cout geschrieben wird (und std::endl), könnte man std:: nicht weglassen, da durch das #include sowieso nach dem präprozessor klar ist, worauf sich "cout" und "endl" beziehen muss?

    • @bytesnobjects
      @bytesnobjects  9 років тому +1

      Noerfi Einfach nur durch das Einbindung von iostream nicht. Die Objekte befinden sich ja immernoch im Namespace std. Wenn, dann müsste ich noch ein using namespace std; anfügen, um die Suchen auf diesen auszudehnen. Was das angeht bin ich manchmal etwas inkonsistent. Hintergrund ist folgender: in Header-Files betrachte ich es als schlechten Stil, ein using namespace... zu verwenden, weil ich damit dem Nutzer meines Headerfiles das quasi aufzwinge (und der sich dann ggf. mit Namenskollisionen rumschlagen darf). Im Implementierungsfile geht das problemlos, da vergesse ich es dann aber manchmal einfach.

    • @svens3722
      @svens3722 7 років тому

      bei using Namespace std; kann man das std:: weglassen.

  • @WhatAboutCover
    @WhatAboutCover 2 роки тому

    Gibt es beim Aufruf des Konstruktors einen unterschied zwischen den folgenden beiden Beispielen?
    I) Klasse k()
    II) Klasse k = Klasse()
    Ansonsten vielen Dank für die Videos. Zuerst war ich skeptisch, da sie auf deutsch waren. Nachdem aber die Basics schön erklärt wurden, bin ich bei der Serie geblieben und sehr überzeugt. Weiter so :)

    • @bytesnobjects
      @bytesnobjects  2 роки тому +1

      Nein, dann der Stelle gibt es keinen Unterschied. Das ist quasi das gleiche. Ich bin mir gerade nicht sicher, ob der Standard einen Aufruf des Copy-Konstruktors zulassen würde bei der zweiten Variante, aber mindestens jeder moderne Compiler sollte das eigentlich verhindern.

  • @onanista557
    @onanista557 10 років тому

    hallo warum wurden die Objekte zum Schluss zerstört, obwohl du ja bei main den Destructor ~Test gar nicht aufgerufen hast?

    • @bytesnobjects
      @bytesnobjects  10 років тому

      Das ist gerade der Vorteil an dieser Technik: man muss sich nicht drum kümmern. Variablen, die sogenannten automatic storage haben (im Prinzip "normale" Variablen, die weder als static markiert sind, noch mittels new allokiert wurden) werden automatisch weggeräumt, wenn ihr Scope verlassen wird (bspw. die Funktion, in der sie deklariert wurden oder (bei globalen Variablen) das gesamte Programm. Im Prinzip kann man sich das vereinfacht so vorstellen: trifft der Compiler auf die schließende Klammer des Blocks, in dem eine Variable deklariert wurde, dann fügt er den entsprechenden Code ein, um sie aufzuräumen. Dazu gehört auch der Destruktoraufruf. Den macht man außer in sehr seltenen Ausnahmefällen eigentlich nie selbst.

  • @pm4598
    @pm4598 7 років тому

    Gute Videos
    Ich hätte 3 Frage!
    1.) Frage beim Destruktor kommt manchmal ein Delete wann wendet man das genau an mit dem Delete und wann nicht ??
    2.) Am Ende hast und gesagt das Test t_copy(t) auch ein Copy Konstruktor ist oder habe ich das falsch verstanden??
    3.) Was ist ein Initialkonstruktor???

    • @bytesnobjects
      @bytesnobjects  7 років тому

      1.) delete verwendet man zum Freigeben von Speicher, den man vorher mit new reserviert hat. Siehe Video 18: ua-cam.com/video/bF_X70AhRBI/v-deo.html
      2.) Das hast du ein wenig falsch verstanden. Der Copy-Konstruktor ist der Konstruktor, der Test const &t als Parameter nimmt. Dieser wird automatisch aufgerufen, wenn ich ein Objekt bei der Initialisierung aus einem anderen kopiere (wie das bei t_copy passiert, welches aus t initialisiert wird).
      3.) Den Begriff kenne ich nicht. Wo hast du den her? (Bitte lass ihn nicht peinlicherweise in einem meiner Videos enthalten sein ;-))

    • @svens3722
      @svens3722 7 років тому

      Hm ich bin eigentlich ein noob aber Frage eins kann ich dir halbwegs beantworten, da ich zurzeit im passenden Kapitel in meinem Buch bin.Mit den befehlen Default,delete kann man dem Kompiler erlauben Konstruktoren/Klassenfunktionen zu verwenden oder nicht. Bsp. Class X{X()= delete;X(int i);}Somit lässt sich der normale Konstruktor nicht mehr aufrufen, nur noch mit Parameter.Oder um Funktionen die einen Int wert bekommen sollen, nicht mit einem Double zu füttern.Allerdings weiss ich gerade nicht unbedingt was das für einen Sinn macht, da man ja die Funktionen einfach überladen kann. Vielleicht gibt es fälle da sollte man Funktionen nicht überladen. Vielleicht kann uns Bytes & Objects weiterhelfen :D