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-id
attribute-specifier-seq
необ.
noptr-declarator
parameters-and-qualifiers
noptr-declarator
[
constant-expression
opt]
attribute-specifier-seq
opt
(
ptr-declarator
)
parameters-and-qualifiers
:
(
parameter-declaration-clause
)
cv-qualifier-seq
необ.
ref-qualifier
optnoexcept-specifier
optattribute-specifier-seq
opt
trailing-return-type
:
->
type-id
ptr-operator
:
*
attribute-specifier-seq
optcv-qualifier-seq
opt
&
attribute-specifier-seq
необ.
&&
attribute-specifier-seq
необ.
nested-name-specifier
*
attribute-specifier-seq
optcv-qualifier-seq
opt
cv-qualifier-seq
:
cv-qualifier
cv-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
см. в следующих статьях:
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по