Objektorientierte Programmierung, Ausgabe ist nicht korrekt.

DerTrojaner

Mitglied
Ich nutzte halt das Programm was die Schule nutzt und einige Grundlagen sind mir recht klar nur 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
 

cwriter

Erfahrenes Mitglied
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
 

Technipion

Erfahrenes Mitglied
Ich nutzte halt das Programm was die Schule nutzt und einige Grundlagen sind mir recht klar nur 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
Zu meiner Zeit musste man so ziemlich alles aus Büchern lernen (EDIT: Okay das klingt falsch, sooo alt bin ich jetzt auch noch nicht /EDIT). Aber in diesen modernen Zeiten findet man (z.B. auf YouTube) durchaus gute Videos zu allen möglichen Programmierthemen. Versuch doch mal eine Suche nach "C++ Grundlagen" auf einer Videoplattform deiner Wahl. Ich vermute, dass du dort in wenigen Stunden die meisten Grundlagen verinnerlichen kannst, und das ist das wichtigste. Oft hapert es nämlich an den Basistechniken, aber wer die Grundlagen solide beherrscht findet sich schnell in neue Techniken und Denkweisen ein!

Was die Borland-Geschichte angeht: Leider kenne ich mindestens 3 Schulen und Unis, an denen mindestens bis 2016 noch Borland und/oder DevC++ eingesetzt wurde. Wenn du es ein bisschen moderner willst (aber immer noch im "Borland-Look") kannst du CodeBlocks probieren: Code::Blocks

Allerdings würde ich mich cwriter anschließen und dir - falls du auf Windows 10 bist - zu VisualStudio raten.

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.
Auch hier leider ein trauriges "kann ich bestätigen" meinerseits. Bei vielen liegt es auch einfach daran, dass sie noch nichts von dem Umbruch in der C++-Welt gehört haben (ja, das ist möglich). Viele Bildungseinrichtungen in meinem Umfeld sind noch nicht einmal in C++11 angekommen. Viele sagen auch modernes C++ wäre zu schwer, allerdings kann ich das nicht bestätigen. Man muss ja nicht jedes Sprachdetail exzessiv nutzen. Aber ich finde es dämlich, dass man als C++-Anfänger deshalb z.B. auf den Genuss von Lambda-Ausdrücken verzichten muss. Ist ja nur meine Meinung. Die Schüler lernen dann später Java oder JavaScript und sind schockiert, wie intuitiv eine Sprache sich anfühlen kann.

Gruß Technipion