-> ??



  • Kann mir einer sagen was und wann ich [ -> ] benutze beim Progrmamieren und was das eigentlich bedeutet ?

    Mfg 🙂


  • Mod

    a->b bedeutet (*a).b und sollte genau dann benutzt werden, wenn du (*a).b benötigst.



  • Sorry ich bin etwas neu kannst mir das bisschen anfänger gerecht erklären ? was das ganz genau heist ?^^ an einem kleinen beispiel sonst kapier ich das nicht utut mir leid 😛

    was bedeutet - (*a).b ..eig ?

    mfg 🙂



  • struct abc
    {
    	int b;
    	int c;
    };
    
    struct abc *a = new(struct abc);
    (*a).b = 1;
    a->c = 2;
    cout << a->b << "\n";
    cout << (*a).c << "\n";
    delete a;
    


  • Wenn a ein Zeiger auf eine struct ist, kannst du mit -> auf den Member (hier b) zugreifen.



  • Du solltest dir in einem Grundlagenbuch den Artikel ueber Pointer durchlesen.



  • Danke euch 🙂

    Ich schaue nun Videos an um das besser zu verstehen , ist ja recht interessant !

    Wusste ich gar nicht.

    Danke mfg :)!



  • Ich hätte da noch eine verwandte Frage.
    Ist es im allgemeinen uneffizienter zu dereferenzieren, oder ist a.b= 2; und a->b = 2 gleich schnell.
    Und kann man in Objecten dann nicht auch immer mit this->data arbeiten oder this->meineMethode();? Hab das unter C++ bisher nicht gesehen.



  • Bengo schrieb:

    Und kann man in Objecten dann nicht auch immer mit this->data arbeiten oder this->meineMethode();? Hab das unter C++ bisher nicht gesehen.

    Ja, kann man. Man sieht es im Konstruktor.

    Klasse::Klasse(int x){
       this->x=x;
    }
    

    also wenn

    Klasse::Klasse(int x)
    :x(x){
    }
    

    nicht geht.



  • Bengo schrieb:

    Ist es im allgemeinen uneffizienter zu dereferenzieren, oder ist a.b= 2; und a->b = 2 gleich schnell.

    Dereferenzieren bringt immer die Gefahr mit, dass das Object nicht im Cache liegt, was dir bei einer Variable die direkt auf dem Stack liegt eher nicht passieren kann. Bei Codestücken der Performant laufen soll kann ein Iterieren über ein Objekt-Array oder -Vektor um einiges schneller sein als über ein Objekt*-Array oder Vektor.



  • Bengo schrieb:

    Ist es im allgemeinen uneffizienter zu dereferenzieren, oder ist a.b= 2; und a->b = 2 gleich schnell.

    Ist mal wieder schwierig das allgemein zu beantworten. Bei dem Fall a.b = 2; muss man wohl zwei Fälle unterschieden: Entweder a ist eine lokale Variable auf dem Stack oder eine Referenz. Wenn a eine lokale Variable ist, dann kann der Compiler sehr direkt die b Membervariable ansprechen. Ist a eine Referenz oder genauso der Fall a->b = 2; , dann muss zuerst ein Pointer (auf Maschinencode Ebene sind Pointer und Referenzen das Gleiche) gelesen und dereferenziert werden und dann kann die b Membervariable geschrieben werden. In der Praxis macht es aber wohl wenig bis gar keinen Unterschied und man kann es sich sowieso nicht aussuchen. Wenn man eine lokale Variable/Referenz hat schreibt kein Mensch (&a)->b und wenn man einen Pointer hat kann man auch kein lokales Objekt mehr daraus machen. Außer man kopiert es, aber das ist erst recht langsamer.

    Bengo schrieb:

    Und kann man in Objecten dann nicht auch immer mit this->data arbeiten oder this->meineMethode();?

    Kann man schreiben wenn man möchte. Manchmal muss man es auch schreiben, wenn es einen Funktionsparameter mit dem gleichen Namen gibt (siehe volkards Antwort). Ob man es schreibt oder nicht ändert aber gar nichts am generierten Code und damit auch nicht an der Geschwindigkeit.



  • struct abc
    {
    	int b;
    	int c;
    };
    
    struct abc x;
    x.b = 1;
    struct abc *a = &x;
    // Es geht noch besser:
    a->c = a->b << a->b << a->b << a->b ^ a->b;
    cout << a->b << "\n";
    cout << (*a).c << "\n";
    

    Hehe, was kommt raus?



  • struct { int b; } abc{1};
    auto x = &abc;
    auto y = &x;
    auto z = &y;
    std::cout << (**z)->b << '\n';
    


  • volkard schrieb:

    Bengo schrieb:

    Und kann man in Objecten dann nicht auch immer mit this->data arbeiten oder this->meineMethode();? Hab das unter C++ bisher nicht gesehen.

    Ja, kann man. Man sieht es im Konstruktor.

    Klasse::Klasse(int x){
       this->x=x;
    }
    

    also wenn

    Klasse::Klasse(int x)
    :x(x){
    }
    

    nicht geht.

    Konstruktor und Initialisierungsliste ist dafür ein unglückliches Beispiel.

    Klasse::Klasse(int x)
    :x(x){}
    

    geht immer.



  • Swordfish schrieb:

    Konstruktor und Initialisierungsliste ist dafür ein unglückliches Beispiel.

    Mit dem "nicht geht" meinte ich durchaus mehr, wie den Chef, der diese Syntax nicht mag/kennt, x mit op= ohne copyctr, static x und so weiter. Hätte ich das nicht ausgeschlossen, wären jetzt schon 30 Postings da, die nachgewiesen hätten, daß

    :x(x)
    

    nicht immer geht.



  • [quote="volkard"]

    Swordfish schrieb:

    [...] Hätte ich das nicht ausgeschlossen, wären jetzt schon 30 Postings da, die nachgewiesen hätten, daß

    :x(x)
    

    nicht immer geht.

    Sorry, wo hast Du was ausgeschlossen? Für einen begriffstützigen Idioten wie mich brauchts da schon ein wenig mehr Worte 😕


  • Mod

    volkard schrieb:


    also wenn

    Klasse::Klasse(int x)
    :x(x){
    }
    

    nicht geht.


Log in to reply