PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfänger: Punkt vs Pfeiloperator bei Klasse



pospiech
05-10-2006, 18:08
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


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

Boron
05-10-2006, 18:22
(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.
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.

nul
05-10-2006, 22:15
und nicht vergessen b zu loeschen!

pospiech
05-10-2006, 22:20
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

Detrius
05-10-2006, 22:36
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.

bischi
06-10-2006, 11:30
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