4.2. Předávání objektů funkcím

Časová náročnost
Časová náročnost: 12 minut

Objekty mohou být jako argumenty předávány funkcím stejným způsobem, jako jsou předávána jiná data. Prostě se deklarují argumenty funkce jako typ třídy a pak se objekt dané třídy použije jako argument při volání funkce.

Stejně jako jiné typy proměnných může být do funkce předána také adresa objektu. Předává se tak, že argument použitý ve volání může být modifikován funkcí.

Volání hodnotou:

src/4_2.cpp
Příklad 4.2.
#include <iostream.h>

class samp {
  int i;
public:
  samp(int n) { i = n; }
  void set_i(int n) { i = n; }
  int get_i() { return i; }
};

/* nastavi o.i na jeho ctverec. Nema to vliv na objekt
   pouzity k volani sqr_it()
*/
void sqr_it(samp o)
{
   o.set_i(o.get_i() * o.get_i());

  cout << "Kopie a ma hodnotu i " << o.get_i();
  cout << "\n";
}

int main()
{
  samp a(10);

  sqr_it(a);  //a predavano hodnotou

  cout << "a.i zustava v main() nezmeneno: ";
  cout << a.get_i(); 

  return 0;
}


Předání adresy:

src/4_3.cpp
Příklad 4.3.
#include <iostream.h>

class samp {
  int i;
public:
  samp(int n) { i = n; }
  void set_i(int n) { i = n; }
  int get_i() { return i; }
};

/* Nastavi o.i na jeho ctverec. To ma vliv na 
   volajici argument
*/
void sqr_it(samp *o)
{
   o->set_i(o->get_i() * o->get_i());

  cout << "Kopie a ma hodnotu i " << o->get_i();
  cout << "\n";
}

int main()
{
  samp a(10);

  sqr_it(&a); // predava adresu

  cout << "a.i ve funkci main() ma zmenenou hodnotu: ";
  cout << a.get_i(); 

  return 0;
}



upozornění Když je při předávání objektu do funkce vytvořena kopie objektu, znamená to, že začíná existovat nový objekt. Když je pak funkce, do níž byl objekt předán ukončena, je kopie argumentu zrušena.

Když je vytvářena kopie pro volání funkce, není konstruktor volán. Konstruktor se používá pro inicializaci určitých vlastností objektu a nemusí být proto volán při vytváření kopie existujícího objektu pro předávání funkci. Kdyby se volal, změnil by se obsah objektu.

Když funkce končí a kopie je rušena, pak se destruktor volá. Je to proto, že objekt mohl provést nějakou operaci, která musí být zrušena.

Na následujícím příkladě si výše uvedené skutečnosti ověříme.

src/4_4.cpp
Příklad 4.4.
#include <iostream.h>

class samp {
  int i;
public:
  samp(int n) { 
    i = n; 
    cout << "Konstruktor\n";
  }
  ~samp() { cout << "Destruktor\n"; }
  int get_i() { return i; }
};

int sqr_it(samp o)
{
  return o.get_i() * o.get_i();
}

int main()
{
  samp a(10);

  cout << sqr_it(a) << "\n";
 
  return 0;
}


Výstup:

Konstruktor
Destruktor
100
Destruktor