Newsgroup: it.comp.lang.c++
Titolo: Copy Constructor ed altro...

Salve,
ipotizziamo di avere questo semplice programmino:
#include <iostream>
class C
{
public:
	C() {}
        C( const C & Object )
	{
		std::cout<<std::endl<<"CC costante!";
	}
	C( C & )
	{
		std::cout<<std::endl<<"CC NON costante!";
	}
	C & operator = ( const C & Object )
	{
			std::cout<<std::endl<<"= costante";
	}
	C & operator = ( C & Object )
	{
			std::cout<<std::endl<<"= NON costante";
	}
};
C prova()
{
	C test;
	return test;
}
int main( int argc, char ** argv )
{
	C t;
	t = prova();
	return EXIT_SUCCESS;
}
Discutiamo della funzione prova: l'istruzione
'return test'
non causa la creazione di una COPIA dell'oggetto che sto cercando di
ritornare ??
Se si, quale e' il costruttore di copia invocato ?? Io nell'esempio
implemento sia quello che prende un oggetto costante (per avere un
comportamento determinato in caso di temporary object) sia quello che
prende un oggetto non costante.
Il punto è che mi aspetterei l'invocazione di qualche costruttore di
copia, cosa che invece non avviene, quindi comincio a pensare che me ne
sia sfuggito uno (o più).
Il mio problema nasce dal fatto che ho una classe Matrix (non è una
matrice nel senso di funzione matematica ma una matrice di punti di
un'immagine...); questa classe ha un puntatore all'interno (lineare)
che rappresenta gli elementi della matrice. Siccome e' dinamico ho
fornito costruttori/distruttore per gestire correttamente le creazioni
degli oggetti, ma in alcuni casi, quando utilizzo una sintassi come
quella della funzione prova, sistematicamente l'unica matrice che posso
raccogliere all'esterno e' vuota (o meglio inizializzata a zero).
Vorrei quindi capire se ho mancato solo un costruttore in particolare o
mi manca qualche pezzo 'teorico'...
Grazie e tutti,
   Bruno Ripa

 copia, cosa che invece non avviene,
Potrebbe dipendere da un'ottimizzazione del compilatore?
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg
The EMG Music page:         
http://www.emagsoftware.it/emgmusic
 

 Potrebbe dipendere da un'ottimizzazione del compilatore?
Sto usando g++ 3.3.5 senza particolari ottimizzazioni, il progetto lo
gestisco con Anjuta ( giusto perche' magari qualcuno dice "Si quell'ide
li' preimposta delle cose....). Ti dice niente ??
Quindi convieni con il mio ragionamento ?? Inizio a frugare tra le flag
del compilatore....

 ha scritto nel messaggio 
news:1130863369.0...@g14g2000cwa.googlegroups.com...

No, ho provato il tuo esempio, l'ho corretto ed ecco il risultato:
#include <iostream>
class C
{
public:
C() {}
        C( const C & )
{
std::cout<<std::endl<<"CC costante!";
}
/*
C( C & )
{
std::cout<<std::endl<<"CC NON costante!";
}
*/
C & operator = ( const C & )
{
std::cout<<std::endl<<"= costante";
return *this;
}
/*
C & operator = ( C & )
{
std::cout<<std::endl<<"= NON costante";
}
*/
};
C prova()
{
C test;
return test;
}
int main( int, char ** )
{
C t;
t = prova();
return EXIT_SUCCESS;
}
L'output è il seguente:
CC costante!
= costante


 Se si, quale e' il costruttore di copia invocato ??
Se avessi tracciato anche l'esecuzione del costruttore, avresti visto che 
vengono creati soltando 2 oggetti C.
Per quello che riguarda la restituzione per copia, lo Standard consente (ma 
non obbliga) il compilatore ad adottare due ottimizzazioni: RVO (Return 
Value Optimization) e NVO (Named Value Optimization). La prima permette di 
elidere la copia quando viene restituito un temporaneo, la seconda permette 
persino di far coincidere un oggetto automatico instanziato localmente con 
l'oggetto restituito. Tale ottimizzazione richiede che tutte le linee di 
esecuzione restituiscano lo stesso oggetto.
Nonostante queste ottimizzazioni, poiché oncettualmente l'oggetto viene 
copiato, il compilatore deve comunque accertare che esista un costruttore 
copia accessibile da quel contesto.
Max

 li' preimposta delle cose....). Ti dice niente ??
Prova anche con -fno-elide-constructors come opzione al compilatore.
Ciao,
- --
Matteo Settenvini
FSF Associated Member
Email : 
mat...@member.fsf.org
- -----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d--(-) s+:- a-- C++ UL+++
P?>++ L+++>$ E+>+++ W+++ N++ o?
w--- O- M++ PS++ PE- Y+>++
PGP+++ t+ 5 X- R tv-- b+++ DI+
D++ G++ e h+ r-- y?
- ------END GEEK CODE BLOCK------
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - 
http://enigmail.mozdev.org
iD8DBQFDZ8HoUDehq0srSdYRAhwDAJsEpa51w/5Wlrhh/1QJVDpBsdVoBgCdGFSU
iOcvckyrIwKYrsoAqO1xrng=
=wLrY
-----END PGP SIGNATURE-----