Lokale Variablen als Rückgabewert
-
Hallo,
ich steige gerade nach langer Programmierpause von C# auf C++ um. Ich fange ganz bei den Anfängen an und habe dabei Probleme.
Wenn eine Methode einen Wert zurückgeben soll der in einer lokalen Variable gespeichert ist, wann funktioniert das? Also hängt das vom Datentyp ab?
Sowas funktioniert augenscheinlich:
int main(void)
{
int b = 0;
b= test();
cout << b;
}int test()
{
int i = 4;
return i;
}Bei Arrays dann aber wieder nicht? Unter C# konnte ich schlicht immer alles zurückgeben ohne darüber nachzudenken...
Danke
Gruß Gargork
-
Solange du Objekte (keine Zeiger oder Referenzen) wie
int,double, oder auch Instanzen von Klassen (structundclass) zurückgibst, brauchst du dir keine Gedanken zu machen. Der Wert wird kopiert und ist während des Funktionsaufrufs und des gesamten umschliessenden Ausdrucks gültig.Problematisch wird es nur, wenn du Verweise (eben Zeiger oder Referenzen) dazu missbrauchst, die Gültigkeitsdauer von Variablen zu "verlängern". In Anführungszeichen, weil man so das Gefühl hat, man könne immer noch auf die Werte zugreifen. In Wirklichkeit hat man damit jedoch undefiniertes Verhalten, weil das referenzierte Objekt bereits zerstört wurde.
-
Nexus schrieb:
...
Gut zusammengefasst
Kleine Ergänzung: Die []-Arrays sind trügerische kleine Miststücke und als Ganzes keine Objekte, sondern nur Zeiger auf einen Speicherbereich. Somit gibt man bei " int a[10]; return a;" eben einen Zeiger auf einen lokalen Speicherbereich zurück, das crasht natürlich (hoffentlich, wenn sowas unentdeckt bleibt, ist das die Hölle).
-
Badestrand schrieb:
Gut zusammengefasst

Vielen Dank.

Badestrand schrieb:
Kleine Ergänzung: Die []-Arrays sind trügerische kleine Miststücke und als Ganzes keine Objekte, sondern nur Zeiger auf einen Speicherbereich.
Da musst du vorsichtig sein. Arrays sind in C++ Objekte, nur werden sie in sehr vielen Kontexten implizit in einen Zeiger konvertiert. Arrays als solche können nicht als Rückgabewert auftreten (was zwar durch den
array-Wrapper wieder wettgemacht wird).