2013-10-08 19 views
12

Ho un argomento su cui sono confuso e su cui ho bisogno di approfondire. È sovraccarico dell'operatore con una versione const e una versione non const.Sovraccarico dell'operatore Const e Non-Const

// non-const 
double &operator[](int idx) { 
    if (idx < length && idx >= 0) { 
     return data[idx]; 
    } 
    throw BoundsError(); 
} 

Sono consapevole che questa parte funzione di una classe, richiede un indice e verifica che la sua logica, restituisce l'indice dei dati dell'array nella classe. C'è anche una funzione con lo stesso corpo ma con la funzione chiama

const double &operator[](int idx) const 

Perché abbiamo bisogno di due versioni?

Questa domanda di esempio potrebbe anche aiutare a elaborare. Quale versione viene utilizzata in ciascuna istanza di seguito?

Array a(3); 
a[0] = 2.0; 
a[1] = 3.3; 
a[2] = a[0] + a[1]; 

mia ipotesi che la versione const viene chiamato solo su a[2] perché non vogliamo rischiare di modificare a[0] o a[1].

Grazie per qualsiasi aiuto.

+1

È possibile controllare facilmente che viene chiamato con l'output al loro interno. – chris

+0

è in una diapositiva di una conferenza quindi speravo di non dover creare una classe per utilizzarli, invece solo qualcuno mi aiuta a capire perché lo facciamo –

+3

Non essere pigro, provalo tu stesso, ti ricorderai meglio. –

risposta

15

Quando entrambe le versioni sono disponibili, la logica è piuttosto semplice: const versione si chiama per const oggetti, non la versione const è chiamato per i non const oggetti. È tutto.

Nell'esempio di codice a è un oggetto non-const, il che significa che la versione non const viene chiamata in tutti i casi. La versione const è mai chiamata nel campione.

Il punto di avere due versioni è di implementare l'accesso "lettura/scrittura" per gli oggetti non const e l'accesso solo "lettura" per gli oggetti const. Per gli oggetti const viene chiamata la versione const di operator [], che restituisce un riferimento const double &. Puoi leggere i dati attraverso quel riferimento const, ma non puoi scrivere attraverso di esso.

+0

Non lo so - ho trovato difficile ottenere la versione non const chiamata. Guarda questa demo dal vivo per favore: http://coliru.stacked-crooked.com/a/1c820d80113bc9e3 –

+1

@ Reb.Cabin: Nella tua demo, non fai mai tentativi di chiamare la versione non-const di 'operator []'. Ogni volta che si ha questa opportunità, si usa invece 'this-> elems [i]'. Nota che 'this-> elems' è un normale puntatore raw. Il suo operatore '[]' è l'ordinario * built-in * indicizzatore, non il tuo indicizzatore sovraccarico. Se vuoi chiamare la tua versione non-const sovraccaricata di 'operator []', devi usare '(* this) [i]' sul lato sinistro dei compiti, non 'this-> elems [i]' . – AnT

+0

Capisco. Ho riscritto il ctor e un esempio migliore per usare l'indicizzatore non-const. Commento utile e chiarificatore. http://coliru.stacked-crooked.com/a/3a2e3960c1e77d78 –