#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.
#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.