Felder von Objekten



  • Hallo,

    ich bekomme in diesem Beispiel:

    #include <iostream>
    using namespace std;
    
    class Punkt {
    	int x;
    	int y;
    public:
    	Punkt(int a = 0, int b = 0) {
    		x = a;
    		y = b;
    	}
    	void printXY() {
    		cout << "x=" << x << " y=" << y << endl;
    	}
    };
    
    int main() {
    	Punkt pFeld[3] = { (11, 1), (12, 2), (13, 3) };
    
    	for (int i = 0; i < 3; i++)
    		pFeld[i].printXY();
    }
    

    Diese Ausgabe:

    x=1 y=0
    x=2 y=0
    x=3 y=0
    

    Ich verstehe nicht, wie es zu dieser Ausgabe kommt. Und muss für das Feld mit new (free) kein Speicher freigegeben werden?

    Danke schon mal.



  • (11, 1) ist ein Ausdruck vom Typ int und hat den Wert 1. Somit steht da

    Punkt pFeld[3] = { 1,  2, 3 };
    

    Ich hoffe jetzt ist die Ausgabe auch klar. Probier mal

    Punkt pFeld[3] = { {11, 1}, {12, 2}, {13, 3} };
    

    (Kompilieren mit -std=c++11 -Wall -pedantic falls du gcc nutzt.) Nein, Speicher freigeben musst du hier keinen. Zudem nutzt man in C++ normalerweise Initialisierungslisten, das sieht dann so aus:

    class Punkt {
        int x;
        int y;
    public:
        Punkt(int a = 0, int b = 0)
            : x(a) // <-
            , y(b)
        {}
        void printXY() {
            cout << "x=" << x << " y=" << y << endl;
        }
    };
    

    Und generell würde ich den Konstruktor bei sowas einfach weg lassen und x und y public machen. In C++ können auch structs Methoden haben. (Der einzige Unterschied zwischen struct und class ist, dass Member bei struct default public sind.)



  • Der Ausruck (11, 1) ist dasselbe wie 11, 1.
    Das Komma ist der sog. Kommaoperator. Zuerst wird das links, dann das rechts ausgewertet. Das Ergebnis ist das, was rechts steht, in deinem Fapl also 1.
    Du 1 führt dann zun Aufruf von Punkt(1, 0).
    Richtig wäre Punkt(11, 1) in der Initialisierungsliste.
    Und nein, den Speicher musst du nicht freigeben.



  • Danke euch beiden!


Anmelden zum Antworten