Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Quando modifica una dichiarazione di dati, la const parola chiave specifica che l'oggetto o la variabile non è modificabile.
Sintassi
declarator:
ptr-declarator
noptr-declaratorparameters-and-qualifierstrailing-return-type
ptr-declarator:
noptr-declarator
ptr-operatorptr-declarator
noptr-declarator:
declarator-idattribute-specifier-seqoptare
noptr-declaratorparameters-and-qualifiers
noptr-declarator[constant-expressionoptare]attribute-specifier-seqoptare
(ptr-declarator)
parameters-and-qualifiers:
(parameter-declaration-clause)cv-qualifier-seqoptare
ref-qualifieroptarenoexcept-specifieroptareattribute-specifier-seqoptare
trailing-return-type:
->type-id
ptr-operator:
*attribute-specifier-seqoptarecv-qualifier-seqoptare
&attribute-specifier-seqoptare
&&attribute-specifier-seqoptare
nested-name-specifier*attribute-specifier-seqoptarecv-qualifier-seqoptare
cv-qualifier-seq:
cv-qualifiercv-qualifier-seqoptare
cv-qualifier:
const
volatile
ref-qualifier:
&
&&
declarator-id:
...optareid-expression
Valori const
La const parola chiave specifica che il valore di una variabile è costante e indica al compilatore di impedire al programmatore di modificarlo.
// constant_values1.cpp
int main() {
const int i = 5;
i = 10; // C3892
i++; // C2105
}
In C++, è possibile usare la const parola chiave anziché la direttiva del #define preprocessore per definire i valori costanti. I valori definiti con const sono soggetti al controllo dei tipi e possono essere usati al posto di espressioni costanti. In C++, è possibile specificare le dimensioni di una matrice con una const variabile come indicato di seguito:
// constant_values2.cpp
// compile with: /c
const int maxarray = 255;
char store_char[maxarray]; // allowed in C++; not allowed in C
In C i valori costanti predefinito sono collegamenti esterni, in modo che possano essere visualizzati solo nei file di origine. In C++, i valori costanti predefinito sono collegamenti interni, che consentono di visualizzarli nei file di intestazione.
La const parola chiave può essere usata anche nelle dichiarazioni del puntatore.
// constant_values3.cpp
int main() {
char this_char{'a'}, that_char{'b'};
char *mybuf = &this_char, *yourbuf = &that_char;
char *const aptr = mybuf;
*aptr = 'c'; // OK
aptr = yourbuf; // C3892
}
Un puntatore a una variabile dichiarata come const può essere assegnato solo a un puntatore dichiarato anche come const.
// constant_values4.cpp
#include <stdio.h>
int main() {
const char *mybuf = "test";
char *yourbuf = "test2";
printf_s("%s\n", mybuf);
const char *bptr = mybuf; // Pointer to constant data
printf_s("%s\n", bptr);
// *bptr = 'a'; // Error
}
È possibile usare i puntatori ai dati costanti come parametri di funzione per impedire alla funzione di modificare un parametro passato tramite un puntatore.
Per gli oggetti dichiarati come const, è possibile chiamare solo funzioni membro costanti. Il compilatore garantisce che l'oggetto costante non venga mai modificato.
birthday.getMonth(); // Okay
birthday.setMonth( 4 ); // Error
È possibile chiamare funzioni membro costanti o non costanti per un oggetto non costante. È anche possibile eseguire l'overload di una funzione membro usando la const parola chiave . Questa funzionalità consente di chiamare una versione diversa della funzione per gli oggetti costanti e non costanti.
Non è possibile dichiarare costruttori o distruttori con la const parola chiave .
const funzioni membro
La dichiarazione di una funzione membro con la const parola chiave specifica che la funzione è una funzione di sola lettura che non modifica l'oggetto per cui viene chiamato. Una funzione membro costante non può modificare membri dati non statici o chiamare funzioni membro che non sono costanti. Per dichiarare una funzione membro costante, posizionare la const parola chiave dopo la parentesi di chiusura dell'elenco di argomenti. La const parola chiave è obbligatoria sia nella dichiarazione che nella definizione.
// constant_member_function.cpp
class Date
{
public:
Date( int mn, int dy, int yr );
int getMonth() const; // A read-only function
void setMonth( int mn ); // A write function; can't be const
private:
int month;
};
int Date::getMonth() const
{
return month; // Doesn't modify anything
}
void Date::setMonth( int mn )
{
month = mn; // Modifies data member
}
int main()
{
Date MyDate( 7, 4, 1998 );
const Date BirthDate( 1, 18, 1953 );
MyDate.setMonth( 4 ); // Okay
BirthDate.getMonth(); // Okay
BirthDate.setMonth( 4 ); // C2662 Error
}
Differenze tra C e C++ const
Quando si definisce una const variabile in un file di codice sorgente C, è necessario:
const int i = 2;
È quindi possibile usare questa variabile in un altro modulo come indicato di seguito:
extern const int i;
Tuttavia, per ottenere lo stesso comportamento in C++, è necessario definire la const variabile come:
extern const int i = 2;
Analogamente a C, è quindi possibile usare questa variabile in un altro modulo come indicato di seguito:
extern const int i;
Se si vuole definire una extern variabile in un file di codice sorgente C++ da usare in un file di codice sorgente C, usare:
extern "C" const int x=10;
per impedire il mangling del nome dal compilatore C++.
Osservazioni:
Quando si segue l'elenco di parametri di una funzione membro, la const parola chiave specifica che la funzione non modifica l'oggetto per cui viene richiamato.
Per altre informazioni su const, vedere gli articoli seguenti: