const (C++)

При изменении объявления данных ключевое слово указывает, const что объект или переменная не изменяются.

Синтаксис

declarator:
ptr-declarator
noptr-declarator parameters-and-qualifiers trailing-return-type
ptr-declarator:
noptr-declarator
ptr-operator ptr-declarator
noptr-declarator:
declarator-idattribute-specifier-seqнеоб.
noptr-declarator parameters-and-qualifiers
noptr-declarator[constant-expressionopt]attribute-specifier-seqopt
( ptr-declarator )
parameters-and-qualifiers:
(parameter-declaration-clause)cv-qualifier-seqнеоб.
ref-qualifieroptnoexcept-specifieroptattribute-specifier-seqopt
trailing-return-type:
-> type-id
ptr-operator:
*attribute-specifier-seqoptcv-qualifier-seqopt
&attribute-specifier-seqнеоб.
&&attribute-specifier-seqнеоб.
nested-name-specifier*attribute-specifier-seqoptcv-qualifier-seqopt
cv-qualifier-seq:
cv-qualifiercv-qualifier-seqнеоб.
cv-qualifier:
const
volatile
ref-qualifier:
&
&&
declarator-id:
...необ.id-expression

Значения const

Ключевое слово const указывает, что значение переменной является константой и сообщает компилятору, чтобы предотвратить изменение программистом.

// constant_values1.cpp
int main() {
   const int i = 5;
   i = 10;   // C3892
   i++;   // C2105
}

В C++можно использовать const ключевое слово вместо #define директивы препроцессора для определения константных значений. Значения, определенные с const помощью, подвергаются типу проверка и могут использоваться вместо константных выражений. В C++можно указать размер массива с переменной const следующим образом:

// constant_values2.cpp
// compile with: /c
const int maxarray = 255;
char store_char[maxarray];  // allowed in C++; not allowed in C

В языке C константные значения по умолчанию имеют внешнюю компоновку, поэтому они могут использоваться только в файлах исходного кода. В языке C++ константные значения по умолчанию имеют внутреннюю компоновку, которая позволяет использовать их в файлах заголовков.

Ключевое слово const также можно использовать в объявлениях указателя.

// 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
}

Указатель на переменную, объявленную как const можно назначить только указателю, который также объявлен как 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
}

Указатели на данные-константы можно использовать в качестве параметров функций, чтобы функция не могла изменять параметр, переданный посредством указателя.

Для объектов, объявленных как const, можно вызывать только функции-члены констант. Компилятор гарантирует, что объект константы никогда не изменяется.

birthday.getMonth();    // Okay
birthday.setMonth( 4 ); // Error

Можно вызывать функции-члены констант или неконстантных для неконстантного объекта. Можно также перегрузить функцию-член с помощью const ключевое слово; эта функция позволяет вызывать другую версию функции для постоянных и неконстантных объектов.

Вы не можете объявлять конструкторы или деструкторы с const помощью ключевое слово.

const функции-члены

Объявление функции-члена с const помощью ключевое слово указывает, что функция является функцией только для чтения, которая не изменяет объект, для которого он вызывается. Функция-член констант не может изменять нестатические элементы данных или вызывать какие-либо функции-члены, которые не являются константами. Чтобы объявить функцию-член константы, поместите const ключевое слово после закрывающей скобки списка аргументов. В const объявлении и определении требуется ключевое слово.

// 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
}

Различия C и C++ const

При определении переменной const в файле исходного кода C это делается так:

const int i = 2;

Затем эту переменную можно использовать в другом модуле следующим образом:

extern const int i;

Но чтобы получить такое же поведение в C++, необходимо определить const переменную следующим образом:

extern const int i = 2;

Как и в C, эту переменную можно использовать в другом модуле следующим образом:

extern const int i;

Если вы хотите определить extern переменную в файле исходного кода C++ для использования в файле исходного кода C, используйте следующее:

extern "C" const int x=10;

для предотвращения изменения имени компилятором C++.

Замечания

При выполнении списка параметров функции-члена ключевое слово указывает, const что функция не изменяет объект, для которого он вызывается.

Дополнительные сведения constсм. в следующих статьях:

См. также

Ключевые слова