Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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 ??

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

  • Autor
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

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.
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");

}

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

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.