Anzeige:
Ergebnis 1 bis 6 von 6

Thema: Anfänger: Punkt vs Pfeiloperator bei Klasse

  1. #1
    Registrierter Benutzer
    Registriert seit
    10.04.2005
    Ort
    Hannover
    Beiträge
    1.854

    Thumbs up Anfänger: Punkt vs Pfeiloperator bei Klasse

    Ich arbeite mich gerade in CPP ein. Meine Programmierkenntniss beschränkt sich auf viele Jahre mit VisualBasic.

    Bei den Klassen scheitere ich gerade dabei den Unterschied zwischen

    a.value = 1; und
    b->value = 1;

    zu verstehen.

    Beispielcode
    Code:
    class test {
    public:
       double value;
    }
    
    int main(int argc, char *argv[])
    {
      test a;
      test *b = new test;
      a.value = 1;
      b->value = 1;
    }
    Alles was ich lesen konnte war das der Punktoperator das ganze Objekt zurückgibt, der Pfeiloperatur dagegen irgentwas mit Pointern zu tun hat.

    Was ist genau der Unterschied ?
    Warum das eine oder das andere nutzen ?
    Welche Beispiele verdeutlichen den Nutzen von dem einen oder anderen ?

    Matthias

  2. #2
    Registrierter Benutzer Avatar von Boron
    Registriert seit
    07.01.2002
    Beiträge
    827
    (Bei Klassennamen immer den ersten Buchstaben groß schreiben )

    Es geht um den Zugriff auf Attribute von Klassen/Strukturen.
    Der . Operator wird verwendet, wenn du auf das Objekt direkt zugreifst.
    Der -> Operator wird verwendet, wenn du auf ein Objekt über einen Zeiger zugreifst.

    Ich nehme mal dein Beispiel und bastle ein wenig weiter.
    Code:
    class Test {
    public:
       double value;
    };
    
    double addiere( Test* x1, Test* x2 )
    {
       double summe;
       summe = x1->value + x2->value;
    
       return summe;
    }
    
    int main(int argc, char *argv[])
    {
       Test a;
       Test *b = new Test;
       a.value = 1;
       b->value = 1;
    
       double zahl = addiere( &a, b );
    }
    Du siehst, dass die Funktion addiere() keine Objekte der Klasse Test direkt möchte, sondern nur Zeiger auf solche Objekte.
    Beim Aufruf aus der main() wird ihr genau das übergeben.
    Der Vorteil ist, dass keine Kopien der Objekte a und b beim Aufruf von addiere() angelegt werden müssen. Von großen Objekten (mit vielen, vielen Attributen) Kopien anzulegen ist sehr zeitaufwändig und kein bisschen speicherschonend.
    Dadurch, dass du nur Zeiger übergibst, kann addiere() mit den Objekten a und b arbeiten und nicht mit Kopien von ihnen.
    Geändert von Boron (05-10-2006 um 21:29 Uhr)
    Gruß Boron (der sich oft wegen mieser Rechtschreibung anderer die Augen reiben muss)

    LINUX IS LIKE AN INDIAN TENT: NO GATES, NO WINDOWS AND AN APACHE INSIDE!
    Hardware Monitoring unter Linux -> http://santafu.sourceforge.net (Temperaturen, Lüfterdrehzahlen und Spannungen)

  3. #3
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    377
    und nicht vergessen b zu loeschen!
    Amilo D - 2,8 Ghz - ATI Radeon 9000
    Debian GNU/Linux 3.1 (Sarge)

  4. #4
    Registrierter Benutzer
    Registriert seit
    10.04.2005
    Ort
    Hannover
    Beiträge
    1.854
    Zitat Zitat von nul Beitrag anzeigen
    und nicht vergessen b zu loeschen!
    mir ist klar, dass man b löschen kann aber was passiert wenn man es nicht tut. Und wird a gelöscht ?

    Matthias

  5. #5
    Registrierter Benutzer Avatar von Detrius
    Registriert seit
    09.03.2004
    Ort
    Altena
    Beiträge
    64
    Anstatt b->value könntest du auch (*b).value schreiben. Nur ist das mit -> doch erheblich schöner.

    a ist eine normale Variable, dass heisst sie wird am Ende des Blocks entfernt.

    b hast du mit new dauerhaft angelegt. Das Objekt wird erst entfernt, wenn Du das mit delete selbst machst. Ansonsten bleibt es solange bestehen, wie das Programm läuft.

  6. #6
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    Zitat Zitat von Detrius Beitrag anzeigen
    Anstatt b->value könntest du auch (*b).value schreiben. Nur ist das mit -> doch erheblich schöner.
    C++ macht schon so ein genug grosses Chaos mit Pointern - da kann mir der Pfeil also wirklich erspart bleiben

    b hast du mit new dauerhaft angelegt. Das Objekt wird erst entfernt, wenn Du das mit delete selbst machst. Ansonsten bleibt es solange bestehen, wie das Programm läuft.
    =Speicherleck

    MfG Bischi

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •