Disegna linea;
e
Disegna *linea = new Disegna();
Mi sa che devi ancora studiare le basi del linguaggio.
Il codice sopra non esemplifica solo due modi di creare un oggetto di
una classe, ma anche due modi di creare un oggetto primitivo.
Per esempio:
int linea;
e
int *linea = new int();
Nel primo caso l'oggetto viene creato sullo stack e nel secondo nello
heap. Per spiegare meglio, nel primo caso la creazione e' automatica e
lo e' anche la distruzione. Cioe' basta definire la variabile "linea"
che automaticamente viene creato un oggetto associato ad essa. Tale
oggetto viene automaticamente distrutto quando la variabile stessa perde
di significato, cioe' quando il flusso di controllo del programma esce
dall'ambito (racchiuso da parentesi graffe) in cui la variabile e'
dichiarata.
Anche nel secondo caso viene definito un oggetto automatico, pure
chiamato "linea", ma tale oggetto questa volta e' di tipo "Disegna*" (o,
nel mio caso "int*"), cioe' e' un puntatore. Tale puntatore viene
automaticamente creato e automaticamente distrutto all'uscita
dall'ambito (o "scope"). In tale istruzione pero' non viene solamente
definita una variabile, ma tale variabile viene anche inizializzata con
l'espressione "new Disegna()" (o, nel mio caso "new int()").
L'espressione "new Disegna()" tenta di allocare esplicitamente un
oggetto nella memoria libera, chiama il costruttore di default di tale
oggetto, e restituisce l'indirizzo di tale oggetto appena creato.
Tale oggetto non verra' mai distrutto se non da un'istruzione "delete".
Ovviamente la memoria occupata da tale oggetto sara' comunque recuperata
al termine del processo.
--
Carlo Milanesi
http://digilander.libero.it/carlmila
>Nel primo caso l'oggetto viene creato sullo stack e nel secondo nello
>heap.
A voler essere fiscali nel primo caso se l'oggetto e di tipo globale
non viene inserito nello stack ma nel DATA SEGMENT del programma.
a voler essere ancora più fiscali allora quell'istruzione
viene codificata in modo che dipende dal suo contesto (scope).
Se lo scope è un qualsiasi blocco annidato (incluse
functions), allora aveva ragione Carlo Milanesi, l'oggetto è
costruito nello stack.
Se lo scope è globale (fuori da qualsiasi blocco, con scope
file), o se metti modificatori tipo extern, static etc,
allora si, hai ragione tu.
Ma se non si precisa lo scope non credo che si possano fare
assunzioni di sorta.
ciao
Soviet
>xnoise ha scritto: