| Časová náročnost: 8 minut |
Stejně jako lze předávat objekty funkcím, mohou funkce
objekty vracet. Aby to bylo možné musíme nejprve deklarovat funkci tak, aby vracela třídu. Pak vrátí objekt takového typu, který určí příkaz
return.
|
Když je funkcí vrácen objekt, vytváří se dočasný objekt, v němž je uložena návratová hodnota. Tento objekt je funkcí skutečně vrácen a jakmile je hodnota vrácena je dočasný objekt zrušen. Zrušení dočasného objektu však může mít některé nechtěné efekty - viz následující příklad.
Při vracení objektů z funkcí musíme být velice opatrní, jestliže tyto objekty obsahují destruktor a vrácený objekt odchází mimo rozsah, jakmile je volající rutině vrácená hodnota. Jestliže má objekt vrácený funkcí svůj vlastní destruktor, uvolní se dynamicky přidělená paměť, a to přesto, že objekt přiřazený k vrácené hodnotě je stále používán.
|
| Příklad 4.5. |
|
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
class samp {
char *s;
public:
samp() { s = '\0'; }
~samp() { if(s) free(s); cout << "Uvolnuji s\n"; }
void show() { cout << s << "\n"; }
void set(char *str);
};
// Nacitani retezce
void samp::set(char *str)
{
s = (char *) malloc(strlen(str)+1);
if(!s) {
cout << "Error\n";
exit(1);
}
strcpy(s, str);
}
// Vraceni objektu
samp input()
{
char s[80];
samp str;
cout << "Zadej retezec: ";
cin >> s;
str.set(s);
return str;
}
int main()
{
samp ob;
ob = input(); // zde vznika chyba
ob.show();
return 0;
}
|
Výstup:
Zadej retezec: petr
Uvolnuji s
Uvolnuji s
ą_gŰÔôŇ
Uvolnuji s
Destruktor je volán
3x. Poprvé když lokální objekt
str odchází mimo rozsah při návratu
input(). Podruhé, když je rušen dočasný objekt vrácený od
input(). Potřetí když program končí, je volán destruktor objektu
ob v
main()