Cosa si intende con "const" alla fine della dichiarazione di funzione?

Ho un libro, dove c'è scritto qualcosa come:

class Foo 
{
public:
    int Bar(int random_arg) const
    {
        // code
    }
};

Cosa significa?

Soluzione

Una "funzione const", denotata con la parola chiave const dopo una dichiarazione di funzione, rende un errore del compilatore per questa funzione di classe cambiare una variabile membro della classe. Tuttavia, la lettura di una variabile di classe va bene all'interno della funzione, ma la scrittura all'interno di questa funzione genererà un errore del compilatore.

Un altro modo di pensare a tale "funzione const" è vedere una funzione di classe come una normale funzione che prende un puntatore implicito this. Così un metodo int Foo::Bar(int random_arg) (senza la const alla fine) risulta in una funzione come int Foo_Bar(Foo* this, int random_arg), e una chiamata come Foo f; f.Bar(4) corrisponderà internamente a qualcosa come Foo f; Foo_Bar(&f, 4). Ora l'aggiunta del const alla fine (int Foo::Bar(int random_arg) const) può essere intesa come una dichiarazione con un puntatore const this: int Foo_Bar(const Foo* this, int random_arg). Poiché il tipo di this in questo caso è const, non sono possibili modifiche delle variabili membro.

È possibile allentare la restrizione "const function" di non permettere alla funzione di scrivere su qualsiasi variabile di una classe. Per permettere ad alcune variabili di essere scrivibili anche quando la funzione è marcata come "const function", queste variabili di classe sono marcate con la parola chiave mutable. Così, se una variabile di classe è marcata come mutabile, e una "funzione const" scrive su questa variabile, allora il codice verrà compilato in modo pulito e la variabile potrà essere modificata. (C++11)

Come al solito quando si ha a che fare con la parola chiave const, cambiare la posizione della parola chiave const in una dichiarazione C++ ha significati completamente diversi. L'uso precedente di const si applica solo quando si aggiunge const alla fine della dichiarazione di funzione dopo la parentesi.

const è un qualificatore molto abusato in C++: la sintassi e l'ordinamento spesso non sono semplici in combinazione con i puntatori. Alcune letture sulla correttezza di const e sulla parola chiave const:

Correttezza di Const

Il C++ 'const' Dichiarazione: Perché & Come

Commentari (6)

Bar è garantito che non cambi l'oggetto su cui viene invocato. Vedi la sezione sulla correttezza delle costanti nelle FAQ del C++, per esempio.

Commentari (1)

Simile a questa domanda.

In sostanza significa che il metodo Bar non modificherà le variabili membro non mutabili di Foo.

Commentari (0)