Ich nutzte halt das Programm was die Schule nutzt
Ist mir schon bewusst - wir sind es uns gewohnt. Das Problem mit diesen veralteten Dingen ist, dass sie die Arbeit eher mühsamer machen. Klar, Lehrer/Professor sind oft zu faul oder haben keine Lust, neuere Technologien zu lernen, aber dann hört man wieder von allen Seiten, C++ sei eine alte und nutzlose Sprache, obwohl sie mehr könnte.
Ich wollte dich nur darauf hingewiesen haben
So, fertig Offtopic.
das war mir schon immer unklar mit dem aufrufen vom Konstruktor und im Internet habe ich nicht so leichte Erklärungen gefunden aber das kann ich nachvollziehen
Belüge dich nicht selbst. Wenn etwas unklar ist, dann frage nach - wir kennen deinen Wissensstand ja nicht
Konstruktoren sind spezielle Funktionen. Die Grundidee: Der Konstruktor soll die Instanz einer Klasse erstellen. Dazu kannst du in der Funktion annehmen, dass du schon genug Speicherplatz hast - was in diesem Speicher steht, ist aber beim Konstruktoraufruf undefiniert. Daher sollst du im Konstruktor die Werte initialisieren.
Nun gibt es Verschiedene Arten von Konstruktoren.
C++:
class Rechteck
{
public:
Rechteck(); // Default Constructor
Rechteck(const Rechteck& r); // Copy Constructor
Rechteck(Rechteck&& r); // Move Constructor (in deiner C++-Version nicht verfügbar)
Rechteck(int a, int b); // Generischer Konstruktor
~Rechteck(); // Destructor
};
Der Default-Constructor ist speziell: Er nimmt keine Argumente an. Wenn kein Konstruktor definiert ist, baut dir der Compiler einen davon. Sobald ein Generischer Konstruktor vorhanden ist, gibt es keinen davon mehr. Copy und Move sind speziell; Kurz gesagt übernehmen sie die Werte aus den Instanzen im Parameter.
Der Destruktor sollte aufräumen. Meist macht der in modernem C++ durch RAII nichts explizit (i.e. der Compiler macht dir den Destruktor), aber theoretisch solltest du daran Resourcen freigeben - hast du in deinem Beispiel nicht.
Zu der Nutzung:
C++:
/* Ruft Rechteck::Rechteck() auf - geht in deinem Beispiel nicht,
da der Default-Constructor implizit gelöscht wurde - du könntest ihn
mit "Rechteck::Rechteck() = default" wiederherstellen.*/
Rechteck rechteck;
/* Dasselbe */
Rechteck rechteck();
/* Ruft den entsprechenden Konstruktor auf */
Rechteck rechteck(123, 42);
/* Alternativ: Copy-Assigning - ist in alten Compilern langsamer. */
Rechteck rechteck = Rechteck();
/* Das alles war auf dem Stack; es geht auch auf dem Heap */
Rechteck* rechteck = new Rechteck(); // Oder anderer Konstruktor
/* Dann musst du aber manuell freigeben */
delete rechteck; // Ruft den Destruktor auf
Generell gilt bei diesen kleinen Dingen: Experimentiere! Füge unterschiedliche couts in unterschiedliche Konstruktoren ein und schaue, wann welcher Konstruktor aufgerufen wird.
Gruss
cwriter