Distruttore (informatica): differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
creata disambigua |
|||
Riga 7:
Il distruttore, a differenza del [[costruttore]], non può accettare nessun tipo di parametro, perché se non chiamato esplicitamente, sarà il compilatore a inserire a fine programma la chiamata al costruttore. Per questo motivo, per ogni classe può esserci un solo distruttore, rendendo impossibile l'[[overloading]].
L'esempio:
class A {int i;
~A() {}
public: A(int v) {i=v;}
};
int main(int argc, char* argv[])
{
A *a = new A(2); // ok
// A b(1); <----- non ammesso perchè il distruttore è privato (error C2248: 'A::~A' : cannot access private member declared in class 'A')
}
compila perfettamente ma impedisce che un oggetto di classe A venga istanziato sullo stack ma consente che venga instaziato sullo heap. È ovvio tuttavia che un metodo di distruzione debba essere fornito all'utente il quale, a questo punto, può accettare anche dei parametri e tornare dei valori.
Esempio:
class A {int i;
static int count;
~A() {}
public: A(int v) {i=v; count++;}
static bool Delete (A *a) {if (!count) return false; count--; delete a; return true;}
};
int A::count = 0;
int main(int argc, char* argv[])
{
A *a = new A(2);
bool b = A::Delete (a);// b=1
b = A::Delete (a); // b=0
}
=== Linguaggi garbage collector ===
|