Mam taki kod:
#include <iostream>
using namespace std;
class MalyObiekt
{
public:
MalyObiekt() { cout << "mo_kd" << endl; }
};
class Obiekt
{
public:
Obiekt() { cout << "kd" << endl; }
Obiekt(const Obiekt &kk) { cout << "kk" << endl; }
Obiekt operator -(Obiekt &o)
{
Obiekt so;
cout << "o-" << endl;
return so;
}
Obiekt operator=(const Obiekt &o)
{
cout << "op" << endl;
return *this;
}
void funkcja(MalyObiekt &mo)
{
cout << "f" << endl;
}
~Obiekt()
{
cout << "des" << endl;
}
};
int main(void)
{
Obiekt o1, o2, *o3;
MalyObiekt mo;
o3 = new Obiekt();
*o3 = o1 - o2;
o3->funkcja(mo);
return 0;
}
Kod wynikowy:
kd
kd
mo_kd
kd
kd
o-
op
kk
des
des
f
des
des
I nie rozumiem za bardzo czemu to się wykona w taki sposób, po linijce o-
Utworzył się ten obiekt so
, uruchomił się konstruktor domyślny, ok. Następna linijka, wyświetla się o-
. Ok. A następnie jest zwracany obiekt so
- ale czy nie powinien teraz uruchomić się destruktor, skoro w tym momencie kończy się "życie" tego obiektu (so
)?
No ale dobra, potem wyświetla się op
, czyli został wywołany operator odejmowania - ale czemu potem uruchamia się konstruktor kopiujący? Chodzi o to, że Obiekt operator=
zwraca kopię obiektu, a Obiekt & operator=
by nie zwracał kopii?
Następnie, przed wywołaniem funkcji funkcja()
uruchamia się destruktor. Odnosi się on do obiektu so
? Ale czemu dopiero teraz, a nie wcześniej?