Condividi tramite


const (C++)

Quando modifica una dichiarazione di dati, la const parola chiave specifica che l'oggetto o la variabile non è modificabile.

Sintassi

declarator:
ptr-declarator
noptr-declarator parameters-and-qualifiers trailing-return-type
ptr-declarator:
noptr-declarator
ptr-operator ptr-declarator
noptr-declarator:
declarator-idattribute-specifier-seqopt
noptr-declarator parameters-and-qualifiers
noptr-declarator[constant-expressionopt opt opt]attribute-specifier-seq
( ptr-declarator )
parameters-and-qualifiers:
(parameter-declaration-clause)cv-qualifier-seqopt
ref-qualifieroptnoexcept-specifieroptattribute-specifier-seq
trailing-return-type:
-> type-id
ptr-operator:
*attribute-specifier-seqopt opt optcv-qualifier-seq
&attribute-specifier-seqopt
&&attribute-specifier-seqopt
nested-name-specifier*attribute-specifier-seqopt opt optcv-qualifier-seq
cv-qualifier-seq:
cv-qualifiercv-qualifier-seqopt
cv-qualifier:
const
volatile
ref-qualifier:
&
&&
declarator-id:
...optid-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 l'impostazione predefinita dei valori costanti è il collegamento esterno, in modo che possano essere visualizzati solo nei file di origine. In C++ l'impostazione predefinita dei valori costanti è il collegamento interno che consente 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 utilizzare 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 segue:

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 l'alterazione del nome del 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:

Vedi anche

Parole chiave