Konsruktor ohne Initialisierung

bagration

Newbie
Registriert
Feb. 2019
Beiträge
4
C++:
#include <iostream>

using namespace std;



class X {

   static int no;

public:

   X(int i = 4) {

     cout << ++no;

   }

   ~X() {

     cout << --no;

   }

};

int X::no{5};



int main() {

   X x, y{x};

   for (int i {0}; i<2; ++i) {

     X x{9};

   }

   X a;

   return 0;

}
/* Verstehe nicht ganz was hier im Konstruktor passiert. Werden die Objekte x und y mit irgendwelchen konkreten Werten initialisiert, oder mit bielibigen Werten? es fehlt die mir bekannte Syntax zur Initialisierung.
Auf jeden Fall soll 676767654 rauskommen.
Mir ist klar wie man auf die ersten zwei Ziffern kommt, aber was geschieht danach? Wenn die for-Schleife einsetzt sollte nach meiner Logik die dritte Ausgabe 8 sein, da einfach das no ausgegeben wird , das zuvor inkrementiert wurde. Aber das ist falsch.

Danke im voraus fuer die Hilfe!
*/
 
Hallo bagration,
ich wiederhole mich an dieser Stelle mal, bitte schreib deine Frage an uns nicht als Kommentar in den Code sondern im Fließtext in den Post. Ein Hallo davor wäre auch ganz nett.

So. Nun zum Thema. Erstens ist eine Initialisierung von Variablen (so weit ich weiß) auch in C++ optional, passiert sie nicht, stehen in dem zugewiesenen Speicherbereich halt noch irgendwelche Bits drin. Zweitens solltest du dir mal anschauen, was das Argument int i = 4 in deinem Konstruktor macht. In diesem Fall tut es gar nichts, in deinem letzten Code schon.
Dann solltest du schauen, was ein static ist. Eine static Variable exisitiert nur ein mal pro Klasse, nicht pro Instanz. (Was wiederum bedeutet, dass in diesem konktreten Beispiel deine Objekte überhaupt keine Membervariablen haben, die initialisiert werden müssten bzw. könnten.)
Als nächstes, solltest du den Code evtl. einfach mal im Debugger durchgehen. Dann siehst du, in welchen Fällen dein Default-Konstruktor aufgerufen wird, wann der Destruktor aufgerufen wird und was das Problem an dieser Konstellation ist. Mit dem Copy-Konstruktor hast du dich ja schon im letzten Thread etwas beschäftigt. Einen Move-Konstruktor gibt es dann auch noch, den kannst du dir später auch mal anschauen.
Davor solltest du dir evtl. auch mal ein Tutorial für OOP mit C++ durchlesen, in dem die Grundlagen etwas ausführlicher erläutert werden. Und wie gesagt, Debugger nutzen, das trägt viel zum Verständnis bei.

Edit: Und um das Ganze noch etwas umzuformulieren: Dir ist klar, wie man auf die erste Ziffer kommt. Schau am besten mit dem Debugger nach, ab wann du dich in der for-Schleife befindest.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: .courson und abcddcba
Wenn die for-Schleife einsetzt sollte nach meiner Logik die dritte Ausgabe 8 sein
  1. Vor der Schleife gibt es nur eine Ausgabe (6).
  2. In jedem Durchgang der Schleife wird x im stack (weil ohne "new") im lokalen scope der Schleife erzeugt, welches daher natürlich am ende eines jeden Durchgangs out of scope geht, also zerstört wird ;)
 
Primitiven Datentypen, welche nicht initialisiert wurden, wird in C++ das zugewiesen, was gerade auf dem Stack liegt - und das kann alles mögliche sein.
Aus diesem Grund solltest du deine Variablen stets initialisieren, außer du befüllst diese umgehend (aber auch dann könntest du diese mit 0 initialisieren). Bedenke, dass es in C++ Unterschiede in der Syntax hinsichtlich Initialisierung und Zuweisung gibt.

Um deinen Kommentar aufzugreifen: beliebige Werte.
 
Zurück
Oben