[c++] Moment wywołania konstruktora, destruktora


(kostek135) #1

Mam taki problem, nie rozumiem dlaczego ten kod

#include 

int i;


class A {

	int a;


	public: A() {

		a = i++;

		printf("%d", a);

		puts(" born");

	}


	~A() {

		printf("%d", a);

		puts(" die");

	}

};


int main()

{

    A a = A();

    a = A();

    return 0;

}

zwraca takie wyjście:

0 born

1 born

1 die

1 die

zamiast:

0 born

0 die

1 born

1 die

Czy da się to zmienić? Co ciekawe dla:

...


int main()

{

    A a = A();

	puts("---");

	a = A();

	a = A();

	puts("---");

    return 0;

}

pomiędzy wywołaniem a == 1 i a == 2 (pomiędzy kreskami), działa tak jak chcę

0 born

---

1 born

1 die

2 born

2 die

---

2 die

obiekt #1 jest tworzony, a jeśli chce w jego miejsce wpisać drugi, to tamten wcześniej jest niszczony. To co jest ponad pierwszą kreską oraz pod drugą, jest dla mnie nielogiczne, obiekt #0 nie jest nigdy niszczony, za to obiekt #2 jest niszczony pod koniec drugi raz. Ponadto, czy można się jakoś ustrzec przed tym, że:

A a;

wywołuje konstruktor bezparametrowy, ale aby zmienna była odłożona na stosie.

Jeśli ma to znaczenie, używam g++ w wersji 4.3.2. na debianie.


(Sawyer47) #2

Pozwoliłem sobie trochę zmienić kod:

#include 

int i = 0;


class A {

   int a;

   int tag;


   public:

   	A(int t) {

      a = i++;

      tag = t;

      printf("[%d] %d", tag, a);

      puts(" born");

   }


   ~A() {

      printf("[%d] %d", tag, a);

      puts(" die");

   }

};


int main()

{

    A a = A(11);

    a = A(22);

    return 0;

}

Wyjście:

[11] 0 born

[22] 1 born

[22] 1 die

[22] 1 die

Wprawdzie dawno nie praktykowałem C++, ale wydaje mi się, że to działa tak:

A a = A(11); odpowiada za "[11] 0 born", bo konstruujesz obiekt.

[22] 1 born bierze się od A(22) - konstruuje obiekt tymczasowy, przypisuje go do a.

Następne dwie linijki "[22] 1 die" to destrukcja tego obiektu tymczasowego oraz obiektu a. Przy czym obiekt tymczasowy niszczony jest od razu po operacji przypisania, a obiekt a dopiero po wyjściu z main. Widać to dopiero w drugim przypadku, gdzie dodałeś jeszcze jedeno przypisanie.

Są niszczone, tylko błędnie polegasz na wartości zmiennej a, przecież wykonując przypisania, jest ona kopiowana.


([alex]) #3

Ten kod wyjaśni więcej, jeżeli nie to pytaj.

#include

(kostek135) #4

Dzięki wielkie, kod @[alex], bardzo dobrze obrazuje, co się dzieje.