4.2. Předávání objektů funkcím
| Č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: | 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: | 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;
}
|
|
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.
|
| 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