Konstruktory i destruktory - kolejność wywołania

0

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?

0

Ale czemu dopiero teraz, a nie wcześniej?

dtor może uruchomić się w każdej chwili po ostatnim użyciu obiektu, ale nie później niż przed wyjściem z zasięgu,
w którym znajduje się obiekt. Nie pamiętam jak to jest z kolejnością dtorów gdy jest kilka obiektów w jednym zasięgu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1