Secondo il libro del mio prof con quell'inizializzazione dovrebbe essere richiamato proprio il costruttore di copia.
A questo punto, visto che sto esaurendo con questo argomento vi riporto un altro piccolo pezzo di codice:

codice:
#include <cstdlib>
#include <iostream>
#include <string.h>

using namespace std;

class stringa
{      char* str;
public:
       stringa(const char s[]);
       ~stringa();
};
stringa::stringa(const char s[])
{
      str = new char[strlen(s)+1];
      strcpy(str, s);
      cout << "ogetto costruito \n";
}
stringa::~stringa()
{
      delete[] str;
      cout << "ogetto distrutto \n";
}
stringa ff()
{
        stringa sg("acqua");
        return sg;
}


int main()
{
    stringa sa = ff();
    system("PAUSE");
    return EXIT_SUCCESS;
}
Allora, secondo quello che ci sta scritto sul libro questo programma non riuscirebbe ad inizializzare l'oggetto classe sa con il risultato della funzione ff poichè al termine della funzione verrebbe chiamato il distruttore dell'oggetto sa, distruttore che va a deallocare l'array str di sa e quindi il risultato sarebbe che sa dovrebbe avere il membro str puntatore ad area di memoria deallocata.

Io ho provato a compilarlo e va tutto bene, alla fine sa risulta proprio inizializzato con il valore restituito da ff, e non solo, il distruttore dell'oggetto sg non viene mai richiamato.

Dove sta la verità?