Una dichiarazione di funzione membro con const
alla fine di esso permette che funzione da chiamare anche su un oggetto const
. Questo ha senso solo per le funzioni membro che non modificano lo stato dell'oggetto.
Diciamo che la classe che hai sovraccaricato questi operatori si chiama X
. Presumibilmente si comporta un po 'come un contenitore, dando accesso agli elementi che contiene attraverso questo operator[]
.
Ora diciamo che l'utente vuole utilizzare un const X
:
const X x = /* fill it */;
use(x[0]);
qualora l'utente essere consentito di fare questo? Probabilmente. Se vogliono un contenitore che è immutabile, allora lascialo avere. Se non hai fornito la versione const
di operator[]
, non sarebbero in grado di farlo. Dopo tutto non stanno cercando di modificare il contenitore, stanno solo guardando il suo contenuto.
Ora perché la versione const
di operator[]
restituisce un riferimento const
? Perché deve. Restituisce un riferimento a un membro della classe stessa. Se il contenitore è stato const
e restituito un non const
di riferimento, il chiamante sarebbe in grado di modificare i suoi interni semplicemente utilizzando questo operatore:
const X x = /* fill it */;
x[0].modify();
Oddio, abbiamo modificare lo stato di x
anche se è const
. Questo sarebbe male e in effetti il compilatore non ti lascerà nemmeno fare.
fonte
2013-03-14 15:49:56
possibile duplicato di [cosa significa const in C++ in luoghi diversi] (http://stackoverflow.com/questions/10482455/what-does-const-mean-in-c-in-different-places) – juanchopanza