Domanda

In C ++, la firma di una funzione dipende in parte dal fatto che sia const. Ciò significa che una classe può avere due funzioni membro con firme identiche, tranne per il fatto che una è const e l'altra no. Se si dispone di una classe come questa, il compilatore deciderà quale funzione chiamare in base all'oggetto su cui la si chiama: se si tratta di un'istanza const della classe, verrà chiamata la versione const della funzione; se l'oggetto non è const, verrà chiamata l'altra versione.

In quali circostanze potresti voler sfruttare questa funzione?

È stato utile?

Soluzione

Questo ha davvero senso solo quando la funzione membro restituisce un puntatore o un riferimento a un membro di dati della tua classe (o un membro di un membro, o un membro di un membro di un membro, ... ecc.). Generalmente la restituzione di puntatori o riferimenti non costanti ai membri dei dati è disapprovata, ma a volte è ragionevole o semplicemente molto conveniente (ad es. Operatore []). In questi casi, fornisci una versione const e una non const del getter. In questo modo la decisione sull'opportunità o meno di modificare l'oggetto spetta alla funzione che lo utilizza, che ha la possibilità di dichiararlo const o non const.

Altri suggerimenti

È lì in modo che tu possa far applicare il compilatore sia che tu restituisca un oggetto const o uno normale, mantenendo comunque la stessa firma del metodo. C'è una spiegazione approfondita su Const Correctness .

Potresti volerlo usare per decidere se restituire o meno un riferimento const a un oggetto. I contenitori dell'STL usano una funzione const () e end () sovraccarica di const per decidere se restituire un const_iterator o un normale iteratore.

Dai un'occhiata al comportamento di std :: map :: operator []. La versione const genera un errore se si tenta di fare riferimento a una chiave non valida, ma la versione non const esegue un inserimento. Il comportamento di inserimento è molto più semplice rispetto a dover usare std :: map :: insert (e farà una sovrascrittura, per di più) ma non può funzionare per una const map.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top