Ciao a tutti, ho scritto un post poco tempo fa per farmi consigliare un linguaggio di programmazione, ne approfitto per ringraziare le ultime due persone che mi hanno risposto, non ho postato lì per non riportare su inutilmente un thread (come avrete capito alla fine ho scelto il C++ :P ).
Sono sicura che mi saprete chiarire questo dubbio:
DOMANDA 1
ho una funzione per fare l'overloading dell'operatore di assegnazione (il this-> l'ho messo solo per chiarezza):
codice:
Copia& Copia::operator=(Copia &sorgente)
{
this->value1 = new int;
*this->value1 = *sorgente.value1;
return *this;
}
Nel mio libro c'è un esempio simile, ho capito in generale a cosa serve fare l'overloading dell'operatore di assegnazione, quello che non ho capito è perché nella dichiarazione del metodo va scritto Copia& mentre il metodo stesso restituisce l'oggetto nell'area di memoria puntata da this (*this)?
Non dovrebbe restituire un riferimento?
E poi un'altra cosa, perché questo metodo deve restituire qualcosa? Non può essere void?
Cioè ammettendo che ho due istenza della classe Copia, ed assegno un oggetto all'altro:
codice:
Classe obj1, obj2;
//codice...
obj1 = obj2;
Non equivale forse a:
codice:
obj1.operatore=(obj2);
Ho letto che serve per le assegnazioni multiple tipo obj1 = obj2 = obj3, ma cosa cambia? ad ogni metodo richiamato tramite "=" non viene passato automaticamente il riferimento all'oggetto passatogli come argomento? Che senso ha che quel metodo restituisca qualcosa? Dove mai potrebbe essere recuperato il valore restituito?
DOMANDA 2
Ne approfitto per chiedervi un'altra cosa, ditemi se ho capito bene.
Se dichiaro un oggetto const, questo oggetto non potrà richiamare metodi non const della classe:
codice:
void Classe::metodo1() { ... }
//codice...
const Classe obj1;
obj1.metodo1(); //ERRORE IN FASE DI COMPILAZIONE
se invece scrivo:
codice:
void Classe::metodo1() const { ... }
//codice...
const Classe obj1;
obj1.metodo1(); //FUNZIONA!
Quindi è virtualmente impossibile che un metodo possa involontariamente modificare l'oggetto chiamante se questo è const?
Ma soprattutto un metodo const può modificare un oggetto chiamante non const? (in effetti potrei provare ma visto che mi è venuto in mente ora lo chiedo XD )
DOMANDA 3
A quanto ho capito il valore restituito da una funzione può essere modificato durante la chiamata della stessa, e per questo motivo è consigliabile dichiarare come const il valore restituito:
codice:
const Classe metodo(); //l'oggetto restituito è costante
Tuttavia mi sono accorta che se si prova a modificare il valore restituito da una funzione, il compilatore restituisce un errore, anche se questa non restituisce un const:
codice:
metodo1().proprieta1 = 0;
Mi da un errore che ora sinceramente non ricordo, ma qualcosa tipo che l'espressione non è ammessa.
Perciò da un punto di vista pratico che utilità ha dichiarare come const il valore restituito da una funzione?
In quali casi può servire?
DOMANDA 4
Non ho ben capito l'utilità pratica della parola extern. Forse ho frainteso il suo significato.
Ad esempio se dichiaro una variabile come extern significa che quella è solo una dichiarazione, mentre la definizione si trova in un altro file oppure più avanti nello stesso sorgente. Ho capito bene?
Se sì, perché mai un programmatore dovrebbe fare una cosa del genere? Sicuramente dal basso della mia ignoranza ed inesperienza non ci arrivo!
DOMANDA 5
Questa è l'ultima, giuro.
Non ho capito se un puntatore auto_ptr può essere l'unico ad avere un riferimento ad un'area specifica di memoria allocata dinamicamente.
Oppure è l'unico puntatore che determina l'esistenza di quell'area di memoria, e cioè l'unico che quando smette di esistere l'area di memoria a cui punta viene distrutta, a prescindere dall'esistenza di altri puntatori a quell'area?
Quindi posso creare un puntatore normale e farlo puntare alla stessa area di memoria del puntatore auto_ptr? E se invece creo due puntatori auto_ptr alla stessa area di memoria come determino qual'è quello responsabile di tale area?
Infine, ho letto che auto_ptr sarà deprecato nel prossimo standard, ma allo stato attuale delle cose ci sono delle alternative? ho letto di shared_ptr e smart_prt ma anche altre varianti, non ho capito se sono presenti nella libreria boost (mi consigliate di utilizzarla?) oppure saranno aggiunti in futuro o ci sono già.
Se ora scrivo un programma con auto_ptr sbaglio? o per ora è l'unico modo?
Ovviamente le domande non finiscono qui, diciamo che per ora può bastare!