Was ist besser: beim Funktionsaufruf einen Zeiger übergeben oder doch lieber Call by Reference?
-
Was ist jetzt eigentlich der Unterschied zwischen
void foo(CString &footext) { footext = "bla"; } int main() { CString text foo(text); return 0; }und
void foo(CString *footext) { *footext = "bla"; } int main() { CString text foo(&text); return 0; }
Vieleicht die Performance? Vieleicht die Sicherheit (Speicherbereichsüberlauf)? Mir hat mal jemand erzählt das es "nicht so gut ist" wenn man Arrays per Call By Reference übergibt und in ihnen "rumschreibt". Das müsste dann ja auch für Objekte z.B. CStringArrays gelten... welches ja im grunde nichts anderes als ein vector ist.
Ich mach zur Zeit ziemlich gerne Call By Reference Aufrufe weil man da nicht so viel schreiben muss. Bin mir aber nicht so sicher ob das auch ok ist

-
Soll auch ein NULL uebergeben werden koennen dann Pointer, weil ne Referenz kann nicht NULL sein bzw nicht NULL gesetzt werden.
Soll immer ein gueltiges Objekt uebergeben werden dann nimm eine Referenz.
Von der Performance her glaube ich nicht, dass es da unterschiede gibt. Ich hab gelernt, dass man in C++ moeglichst immer Referenzen nehmen soll (weil die sicherer sind da sie nicht NULL sein koennen) ausser wenn es nicht anders geht.
P.S.: gehoert das nicht eher ins C++ Forum?
-
thx,
ich würd sagen es gehört eher in Rund um die Programmierung, weil es ja keine Frage des Wie sondern eher eine Frage des Was ist besser ist. naja kann mich auch irren.
-
Hatten wir erst vor 2 oder 3 Wochen im C++-Forum.
Eine Refrence ist nur ein anderer Name für ein Objekt! Ein Pointer ist ein Zeiger der auf ein Objekt zeigt.
Es gibt also definitiv einen technischen Unterschied. Was der Compiler am Ende draus macht, ist eine andere Story.
Pointer benutze ich dann, um einen fachlichen Unterschied zu zeigen, z.B. das der User mir auch NULL übergeben kann, so das sich z.B. der Programmablauf ändert. Kann ja schliesslich gewollt sein, weil es _fachlich_ so sein soll ohne technischen Hintergrund.
-
Dieser Thread wurde von Moderator/in kingruedi aus dem Forum Rund um die Programmierung in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Chris++ schrieb:
Was ist jetzt eigentlich der Unterschied zwischen [...]
kein unterschied, der irgendwie von bedeutung wäre.
Vieleicht die Performance?
theoretisch gibt es einen leichten performanceunterschied. und zwar erlaubt der zeiger, daß 0 übergeben wird und die referenz erlaubt es nicht. der compiler könnte daher damit rechnen, daß beim ersten zugriff auf den zeiger eine exception ausgelöst wird, und entsprechenden code generieren. bei der exception kann er es sein lassen.
allerdinsg kenne ich noch keinen compiler, der das macht.Vieleicht die Sicherheit (Speicherbereichsüberlauf)?
kein technischer sicherheitsgewinn. aber natürlich ein sicherheitsgewinn, was die bedienung angeht. es ist deutlich schwiriger, ohne schmerzen und viel herumgecaste eine falsch referenz zu erzeugen als einen falschen zeiger.
Ich mach zur Zeit ziemlich gerne Call By Reference Aufrufe weil man da nicht so viel schreiben muss.
das ist ein gutes argument für referenzen. vielleicht das einzige.
naja, es gibt noch eins. durch referenzen sagst du einen stillschreigenden kommentar an den benuter der funktionvoid barMitRef(Foo& f);//f muß ein korrekt konstruiertes objekt seindas kann hilfreich sein.
allerdings kann es bei der fehlersuche gemein werden.
f.setMember(g()); barMitRef(f); printOut(f); assert(f.getMember!=17);die assertion hat zugeschlagen. ich suche den fehler. bei dieser version suche ich also, ob g() korrekten kram geliefert hat und ob barMitRef() korrekt arbeitet und auch ob printOut() korrekt arbeitet.
bei
f.setMember(g()); barMitPtr(&f); printOut(f); assert(f.getMember!=17);suche ich genausoviel.
habe ich allerdings verabredet, daß ich immer nur zeiger benutze zum schreiben, und referenzen nur als const-referenzen, dann suche ich mit
f.setMember(g()); barMitPtr(&f); printOut(f); assert(f.getMember!=17);gar nicht mehr bei printOut(). in meiner coding convention ist sicher, daß printOut() nichts verändert haben kann. als ich noch viel zeit mit dem fehlersuchen bei so sachen verbracht habe, war es für mich ein großer vorteil, die referenzen nur so zu benutzen.
heute isses mir egal.