4.3. Pole objektů

Časová náročnost
Č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.

upozornění

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.

src/4_5.cpp
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()