C++-ban ha a visszatérő érték egy új objektum, akkor az hogy nem szűnik meg a visszatérés pillanatában?
Pl. ha így néz ki egy osztály tagfüggvénye:
string Class::toStr() {
return string("xyz");
}
...
Class obj;
cout << obj.tostr();
Ilyenkor az új string objektum hogyan létezhet a hívó oldalon, amikor a hívott függvényen belül jött létre?
De így is működik:
string Class::toStr() {
string s("xyz");
return s;
}
Csak nem értem, miért. :(
Nem lettem sokkal okosabb a válaszoktól, de közben én is keresgéltem, és itt egy kicsit jobban kifejtik:
A linked elég jól elmondja. Amikor létrehozol egy stringet, az a }-nél megszűnik, de a return dolga, hogy visszaadjon egy másolatot. Ez a másolat a hívás helyén mint a függvény értékét jelképező temporális objektum jelenik meg, a temporális objektumok pedig a kifejezés végéig (gyakorlatilag az első ;-ig) élnek.
Tehát a te példádban a
cout << obj.toStr();
így egyben a kifejezés, és a toStr által gyártott string MÁSOLATA egész a végéig él.
Ha referenciát adnál vissza, tehát a toStr visszatérési értéke const string& lenne (sima string& nem jó, mert a temporálisra (ez most egy másik temporális, a string("xyz") kifejezés eredményezte temporális) nem állíthatsz nem-const referenciát), akkor valóban gond lenne: a toStr lefutásakor megszűnne a referált objektum, és a cout már csak egy leölt stringet próbálna kiírni.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!