Zum Inhalt springen

Returnwert oder Referenzparameter (war: return)


Empfohlene Beiträge

Geschrieben

Hallo,

man kann eine Funktion so schreiben

CString xyz(CString str)
{
return str;
}
[/PHP]

oder so

[PHP]void xyz(CString &str)
{
}

in beiden Fehlen kriege ich str zurück, was ist besser bzw. was benutz man wann ??

Geschrieben
Originally posted by 007ski

Hallo,

man kann eine Funktion so schreiben

CString xyz(CString str)
{
return str;
}
[/PHP]

oder so

[PHP]void xyz(CString &str)
{
}

in beiden Fehlen kriege ich str zurück, was ist besser bzw. was benutz man wann ??

Ich wuerde generell die erste Variante bevorzugen, da dadurch die Kopplung reduziert wird, beim zweiten Fall veraendere ich was im Aufrufer irgendwo definiert wurde und das kann doch dann zu boesen Nebenwirkungen fuehren wenn man sich dessen nicht (mehr) bewusst ist.

Wobei ich glaube, dass str nach dem Verlassen von xyz nicht mehr gueltig ist da es ein formaler Parameter ist und dann nach der Call-Stack-Bereininung nicht mehr gueltig ist, das str ja ein "formaler Parameter" ist.

Ich wuerde einen Zeiger auf CString zurueckgeben und das Objekt in xyz mittels new auf dem Heap anlegen.

Frank

Geschrieben
Originally posted by SgtBadAzz

Ich wuerde generell die erste Variante bevorzugen, da dadurch die Kopplung reduziert wird

was meinst Du unter Kopplung

Originally posted by SgtBadAzz

beim zweiten Fall veraendere ich was im Aufrufer irgendwo definiert wurde und das kann doch dann zu boesen Nebenwirkungen fuehren wenn man sich dessen nicht (mehr) bewusst ist.

ich dachte ich gebe nur die Adresse verende aber nichts

Originally posted by SgtBadAzz

Ich wuerde einen Zeiger auf CString zurueckgeben und das Objekt in xyz mittels new auf dem Heap anlegen.

Frank

kannst Du ein Beispielcode schreiben

Geschrieben
Originally posted by SgtBadAzz

Wobei ich glaube, dass str nach dem Verlassen von xyz nicht mehr gueltig ist da es ein formaler Parameter ist und dann nach der Call-Stack-Bereininung nicht mehr gueltig ist, das str ja ein "formaler Parameter" ist.

Das ist kein Problem, da vor dem Verlassen der Funktion eine Kopie des Rückgabewertes auf dem Stack angelegt wird. Nur das Zurückgeben von Adressen oder Referenzen lokaler Variablen ist ein Fehler.
Geschrieben
Originally posted by 007ski

was meinst Du unter Kopplung

ich dachte ich gebe nur die Adresse verende aber nichts

kannst Du ein Beispielcode schreiben

Na ja , wenn ich was per Referenz uebergebe habe ich die Moeglichkeit darin was zu aendern und die Aenderung bleibt bestehen auch wenn die Funktion verlassen wird, d.h. ich kopple das stark aneinander.

Man uebergibt ja meistens eine Referenz wenn man was veraendern will.

void xyz(CString &str) {

str.add("noch mehr Text"); // zum Beispiel

}

Dann wird str im Aufrufer dadurch veraendert, das finde ich nicht so schoen, vor allem weil der Aufrufer eventuell nicht weiss das du das machst, man muss das dann sehr genau dokumentieren und es kann unter umstaenden zu ein paar nasty bugs fuehren.

Das mit dem Heap habe ich so gemeint:

CString* xyz(CString str) {

CString *p_Cstr = new CString("Teil 1 ");

p_CStr->add(", Teil 2");

}

Geschrieben
Originally posted by 007ski

was meinst Du unter Kopplung

ich dachte ich gebe nur die Adresse verende aber nichts

kannst Du ein Beispielcode schreiben

Na ja , wenn ich was per Referenz uebergebe habe ich die Moeglichkeit darin was zu aendern und die Aenderung bleibt bestehen auch wenn die Funktion verlassen wird, d.h. ich kopple das stark aneinander.

Man uebergibt ja meistens eine Referenz wenn man was veraendern will.

void xyz(CString &str) {

str.add("noch mehr Text"); // zum Beispiel

}

Dann wird str im Aufrufer dadurch veraendert, das finde ich nicht so schoen, vor allem weil der Aufrufer eventuell nicht weiss das du das machst, man muss das dann sehr genau dokumentieren und es kann unter umstaenden zu ein paar nasty bugs fuehren.

Das mit dem Heap habe ich so gemeint:

CString* xyz(CString str) {

CString *p_Cstr = new CString("Teil 1 ");

p_CStr->add( str.c_str()); // ich weiss nicht genau wie die methoden aussehen,

// aber es geht ja um das Prinzip

return p_Cstr;

}

Das CString Objetc mit Teil 1 usw. ist dann auf dem Heap und nach verlassen der Funktion immer noch gueltig.

Frank

Geschrieben
Originally posted by Klotzkopp

Das ist kein Problem, da vor dem Verlassen der Funktion eine Kopie des Rückgabewertes auf dem Stack angelegt wird. Nur das Zurückgeben von Adressen oder Referenzen lokaler Variablen ist ein Fehler.

Ja stimmt, habe mich vertan, er macht ja eine 1 zu 1 Kopie und die wird wie

ein normaler Rueckgabeparamter behandelt.

Frank

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...