Mi è chiaro quanto hai detto!!!...Però, partendo da un esempio appositamente sbagliato dello Schildt, ho provato io a correggerlo, realizzando un costruttore; posto il codice:
#include <conio.h>
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
class sample
{
char *s;
public:
sample() { s = '\0'; }
sample( const sample &obj );//costruttore di copia
~sample() { if(s) delete [] s; cout << "Rilascio di s\n"; }
void show() { cout <<"Funzione show() " << s << '\n'; }
void set(char *str);
};
sample::sample( const sample &obj )
{
s = new char[80];
if(!s)
{
cout << "Impossibile allocare\n";
exit(1);
}
cout << "Costruttore di copia.\n";
strcpy(s, obj.s);
}
void sample::set(char *str)
{
s = new char[strlen(str) + 1];
if(!s)
{
cout << "Impossibile allocare\n";
exit(1);
}
strcpy(s, str);
}
//Restituzione di un oggeto del tipo sample
sample input()
{
char instr[80];
sample str;
cout << "Inserire una stringa:\n";
cin >> instr;
str.set(instr);
return str;
}
int main()
{
sample ob;
ob = input();
ob.show();
getch();
return 0;
}
Se lo mando in esecuzione ho il seguente output:
Inserire una stringa:
Ciao
Rilascio di s
Funzione show 0?'
Rilascio di s
Dopo la scritta "Funzione show" dovrebbe esserci scritto "Ciao" invece di "0?'"; questo mi fa capire che il costruttore di copia non è stato chiamato e quindi quando viene liberata l' area di memoria puntata da s dell' oggetto str, il puntatore s di ob punta a chissà quale locazione che contiene i caratteri "0?'".
Perchè questa volta il costruttore di copia non viene chiamato? Ho sbagliato a implementarlo?
Inoltre, la prima scritta "Rilascio di s" si riferisce al distruttore invocato quando l' oggetto str (della funzione input() ) va fuori scopo; però subito dopo dovrebbe apparire un' altra scritta "Rilascio di s", che invece non c' è, dovuta alla distruzione dell' oggetto temporaneo invisibile che contiene il valore restituito.
Perchè non appare questa scritta?