PDA

Visualizza la versione completa : [C++] Uso di "const" nelle funzioni


AlexlovesUSA
16-12-2010, 17:16
Ciao a tutti.
Ho studiato dal libro di C++ che quando una funzione si definisce virtual, ossia può essere chiamata tramite puntatore, il che si usa nel polimorfismo ecc..., alla fine della stessa si mette la parola riservata const. Ho notato anche che ci sono, sia sul libro che negli esercizi del mio professore, delle funzioni che, pur non essendo definite virtuali, hanno la parola const alla fine. Cosa significa e perchè si mette?

P.S.
1)Per quanto riguarda il puntatore *this, da quanto ho capito, sarebbe un altro nome per indicare la classe dentro la quale ci troviamo, giusto?
2)Se volessi realizzare un programma ad oggetti con l'allocazione di memoria dinamica, il delete, dovrei metterlo all'interno del distruttore?

MItaly
16-12-2010, 18:15
Originariamente inviato da AlexlovesUSA
Ciao a tutti.
Ho studiato dal libro di C++ che quando una funzione si definisce virtual, ossia può essere chiamata tramite puntatore, il che si usa nel polimorfismo ecc..., alla fine della stessa si mette la parola riservata const. Ho notato anche che ci sono, sia sul libro che negli esercizi del mio professore, delle funzioni che, pur non essendo definite virtuali, hanno la parola const alla fine. Cosa significa e perchè si mette?
const e virtual sono due concetti ortogonali, cioè un metodo può essere const ma non virtual, virtual ma non const, sia const che virtual e né const né virtual, le due cose sono indipendenti.
virtual mi pare di capire che già sai a cosa serve; const invece fa sì che il metodo non possa modificare i campi della classe, e di riflesso per questo può richiamare solo metodi const (dell'oggetto su cui opera). Per dirla in un'altra maniera, il puntatore che this che viene passato ad una funzione const è a sua volta const, per cui tramite esso il metodo non può modificare i dati puntati.
Per ulteriori informazioni, ti consiglio di leggere questa pagina (http://www.parashift.com/c++-faq-lite/const-correctness.html).


P.S.
1)Per quanto riguarda il puntatore *this, da quanto ho capito, sarebbe un altro nome per indicare la classe dentro la quale ci troviamo, giusto?
I metodi in realtà sono delle normali funzioni, a cui viene passato come argomento "nascosto" il puntatore this, tramite il quale il metodo "sa" su che istanza della classe opera.


2)Se volessi realizzare un programma ad oggetti con l'allocazione di memoria dinamica, il delete, dovrei metterlo all'interno del distruttore?
Se è solo la classe in questione a "possedere" la memoria che vai a deallocare, sì.

AlexlovesUSA
16-12-2010, 18:37
Quindi quel const alla fine indica che la funzione può operare soltanto sui metodi costanti della classe, ossia che non vanno a modificare dati della classe. Che differenza c'è tra il metterlo all'inizio e alla fine?

MItaly
16-12-2010, 18:48
Const di fronte a tutto si riferisce al tipo restituito (ha senso metterlo in genere solo se si restituisce un puntatore o un reference), const alla fine si riferisce al metodo.

AlexlovesUSA
16-12-2010, 21:10
Intendi dire se una funzione ritorna un tipo puntatore? Perchè conviene mettere const in tal caso?

MItaly
16-12-2010, 22:10
Non "conviene", dipende da cosa si vuole fare. Se vuoi restituire un riferimento ad un oggetto (perché creare una copia di questo oggetto è troppo dispendioso o per altri motivi) ma non vuoi che il chiamante lo modifichi, restituirai un riferimento const.

AlexlovesUSA
17-12-2010, 11:33
Ok, grazie mille. Ciao

MItaly
17-12-2010, 14:41
:ciauz:

Loading