Wann kommt der .-Operator zum Einsatz?
-
Nein, für sowas:
std::string xxx("Hallo, Welt"); cout << xxx.length(); // <-
-
BorisDieKlinge schrieb:
vll. für sowas...
Mal ganz abgesehen davon, dass man den . Operator nicht überladen kann: Wo kann man das herkriegen, was du rauchst?

-
Achso- garnicht schlecht.
Danke für das Beispiel
Aber für eigene Klassen isses ziemlich sinnlos, ne?^^
-
nein, auch bei eigenen Klassen kannst du mit dem .-operator auf Member zugreifen:
class foo{ public: int bar; void tu_was(); }; int main() { foo f; f.bar = 5; //Zugriff auf member bar ueber den .-operator f.tu_was(); //Zugriff auf memberfunktion tu_was ueber den .-operator }was -> fuer Zeiger auf Objekte ist, ist . fuer die Objekte selber.
-
777 schrieb:
Aber für eigene Klassen isses ziemlich sinnlos, ne?^^
Nur sinnlos, wenn du alle Objekte dynamisch anlegst und nur per Zeiger darauf zugreifst. Das ist in einigen Frameworks gängiger Programmierstil, vielleicht kommst du von sowas her und denkst, das wäre universell. In modernem C++ legt man Objekte aber vorzugsweise auf dem Stack an und greift direkt oder über Referenzen darauf zu, so dass der . Operator deutlich häufiger zu Einsatz kommt.
-
wurd der .-operator nich bei STL container iterator überladen?
-
Was bedeutet "überladen" genau?
-
Bashar schrieb:
In modernem C++ legt man Objekte aber vorzugsweise auf dem Stack an und greift direkt oder über Referenzen darauf zu, so dass der . Operator deutlich häufiger zu Einsatz kommt.
Wäre es möglich, dass jemand vielleicht mal ein syntaktisches Beispiel postet, wie genau das in der Praxis aussehen könnte?
Ich hab echt keine Ahnung, wie man das DIREKT machen soll?
cya
David
-
Soweit ich weiss, ist
object->member();ja nur ein Alias für
(*object).member();Liege ich da richtig?
-
777 schrieb:
Wäre es möglich, dass jemand vielleicht mal ein syntaktisches Beispiel postet, wie genau das in der Praxis aussehen könnte?
s. Pumuckls Posting
-
@Boris: Nein, die Iteratoren haben "nur" den -> überladen. 'operator.' zu überladen verbietet der Sprachstandard.
@777: Wenn du deine Objekte per new/delete verwaltest und nur mit Zeigern hantierst, brauchst du den Pfeil, bei "einfachen" Objekten den Punkt:
class test { public: int val; }; test t; t.val = 4711; test* p = new test; p->val = 4711;@mbu: Solange niemand den op-> überladen hat, ja

-
CStoll schrieb:
@Boris: Nein, die Iteratoren haben "nur" den -> überladen. 'operator.' zu überladen verbietet der Sprachstandard.
Und natürlich den Dereferenz(*)-Operator.
-
mbu schrieb:
Soweit ich weiss, ist
object->member();ja nur ein Alias für
(*object).member();Liege ich da richtig?
jo, liegst du.
-
Beispiel:
class ZahlKlasse { int zahl; }; main() { ZahlKlasse klasse1; ZahlKlasse* klasse2 = new ZahlKlasse; klasse1.zahl = 5; klasse2->zahl = 5; };so gehts

-
Okay... THX.
Anhand eurer Beispiele habe ich jetzt verstanden, wann Punkt und wann -> Operatoren zum Einsatz kommen.
Doch es bleibt für mich jetzt eine Frage offen:Warum gibt es überhaupt Zeiger?
Oder warum benutzen heutzutage alle Compiler, welche eine grafische Oberfläche vorgeben zum Zugriff auf API-Objekte Zeiger?
Was genau ist der Sinn, wo es doch auch fast noch leichter mit direkten Objekten geht.cya
David
-
Zeiger gibt's, um damit auf Objekte zugreifen zu können, die "woanders" liegen (z.B. auf dem Heap). Und Objekte außerhalb des eigenen Funktionsstack anzulegen hat den unbestreitbaren Vorteil, daß sie in der Lage sind, das Funktionsende zu überleben (lokale Variablen werden gelöscht, wenn sie ihren Scope verlassen).
Ja, in einigen Fällen kann man auch Referenzen verwenden, aber die können (außer mit halblegalen Programmiertricks) nach der Erzeugung nicht mehr verbogen werden.
PS: Interessanterweise lassen "modernere" Sprachen eher die lokalen Variablen weg als die Zeiger

-
Jap - in C# isses beispielsweise anders. Hier gibts überhaupt keine Pointer mehr- oder sagen wir: Ich hab noch keine gesehen

-
Klar gibt's in C# und Java auch Pointer - die heißen nur dort nur "Referenzen" (und sind ein wenig unter der Oberfläche verborgen).
(PS: Nein, das sollte jetzt kein Aufruf zum Flamewar werden)
-
CStoll schrieb:
Klar gibt's in C# und Java auch Pointer - die heißen nur dort nur "Referenzen" (und sind ein wenig unter der Oberfläche verborgen).
Mal ganz davon abgesehen, dass (ich nenne sie mal zusammenfassend) "Managed-Referenzen" eigentlich Zeiger sind, hat die Sprache C# tatsächlich auch "richtige" Zeiger, also die Dinger mit dem Sternchen. Die lassen sich allerdings nur im Unsafe-Kontext benutzen, sonst weint der Compiler

-
Mhh.... also wegen der Sache mit den Zeigern muss ich dann doch nochmal nachhaken.
Du meintest, dass die deswegen ihre Vorteile haben, weil Objekte normalerweise gelöscht werden, sobald sie die Funktio beendet wird in der sie sich momentan befinden.
Das stimmt zwar, aber es stört doch auch nicht.Habe ich beispielsweise ein Formular mit Button, dann soll das ja auch nur so lange da sein, wie die WINAPI-MainFunktion läuft.
Sobald diese verlassen wird ist ja eh Ende und man braucht die Objekte nicht mehr.Zudem befinden sich alle Objekte eines Prozesses ja eh in einem reservierten Speicherbereich.
Also werden auch beim Beenden die Objekte auf die die Pointer zeigen mitgelöscht- oder irre ich mich da?cya
David