Что означает const
в квалификаторе верхнего уровня в С++?
И какие еще уровни?
Например:
int const *i;
int *const i;
int const *const i;
Что означает const
в квалификаторе верхнего уровня в С++?
И какие еще уровни?
Например:
int const *i;
int *const i;
int const *const i;
Определяющий атрибут const верхнего уровня влияет на сам объект. Другие только относящихся к указателям и ссылкам. Они не делают объект const и только предотвращать модификацию по пути с использованием указателя или Справка. Таким образом:
char x;
char const* p = &x;
Это не константа верхнего уровня, и ни один из объектов не является неизменным.
Выражение *p
не может использоваться для изменения x
, но другие выражения
возможно; x
не const. Если уж на то пошло
*const_cast<char*>( p ) = 't'
является законным и четко определенным.
Но
char const x = 't';
char const* p = &x;
На этот раз на x
существует константа верхнего уровня, поэтому x
является неизменной. нет
выражение разрешено изменять его (даже если используется const_cast
).
компилятор может помещать x
в постоянное запоминающее устройство, и он может предположить, что
значение x
никогда не изменяется, независимо от того, что может сделать другой код.
Чтобы указать верхний уровень указателя const
, вы должны написать:
char x = 't';
char *const p = &x;
В этом случае p
будет указывать на x
навсегда; любая попытка изменить это
это поведение undefined (и компилятор может помещать p
в постоянное запоминающее устройство,
или предположим, что *p
относится к x
, независимо от любого другого кода).
int *const i
помещает const
на верхний уровень, тогда как int const *i
не делает.
Первое говорит, что указатель i
сам неизменен, тогда как второй говорит, что указатель указывает на неизменное.
Всякий раз, когда const
появляется непосредственно перед или после типа идентификатора, это считается квалификатором верхнего уровня.
Как мне объяснили, учитывая:
[const] TYPE * [const] VARIABLE
VARIABLE используется для указания данных типа TYPE через *VARIABLE
Нарисуйте линию через *
или несколько *
s
*
есть const
, это относится к
данные и данные не могут быть изменены: *VARIABLE
не может быть назначено, кроме как при инициализацииconst
для справа *
, оно применяется к
VARIABLE, и то, что указывает параметр VARIABLE, не может быть изменено: VARIABLE
не может быть назначено, за исключением инициализацииИтак:
| left right
int * i1;
| no no can change *i1 and i1
int const * i2;
| yes no cannot change *i2 but can change i2
int * const i3;
| no yes can change *i3 but i3 cannot be changed
int const * const i4;
| yes yes cannot change *i4 or i4
Двумя уровнями константы являются: * Низкоуровневая Const * Верхний уровень Const
Вы должны смотреть на верхний и нижний уровни const через ссылки и указатели, потому что это то, где они актуальны.
int i = 0;
int *p = &i;
int *const cp = &i;
const int *pc = &i;
const int *const cpc = &i;
В приведенном выше коде есть 4 разных объявления указателя. Пропустите каждый из них,
int *p
: Обычный указатель может быть использован для внесения изменений в базовый объект и может быть переназначен.
int *const cp
(int *const cp
-const): Const Pointer может использоваться для внесения изменений в базовый объект, но не может быть переназначен. (Невозможно изменить его, чтобы указать на другой объект.)
const int *pc
(low-level const): указатель на Const не может использоваться для внесения изменений в базовый объект, но сам может быть переназначен.
const int *const cpc
(как верхний, так и низкоуровневый const): Const Указатель на Const не может использоваться для внесения изменений в базовый объект и сам не может быть переназначен.
Кроме того, константа верхнего уровня всегда игнорируется при назначении другому объекту, тогда как нижний уровень const не игнорируется.
int i = 0;
const int *pc = &i;
int *const cp = &i;
int *p1 = cp; // allowed
int *p2 = pc; // error, pc has type const int*
Надеюсь, это помогло :) FYI: C++ Primer имеет много информации о том же !!!