Что такое квалификаторы верхнего уровня?
Что означает const
в квалификаторе верхнего уровня в С++?
И какие еще уровни?
Например:
int const *i;
int *const i;
int const *const i;
Ответы
Ответ 1
Определяющий атрибут 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
, независимо от любого другого кода).
Ответ 2
int *const i
помещает const
на верхний уровень, тогда как int const *i
не делает.
Первое говорит, что указатель i
сам неизменен, тогда как второй говорит, что указатель указывает на неизменное.
Всякий раз, когда const
появляется непосредственно перед или после типа идентификатора, это считается квалификатором верхнего уровня.
Ответ 3
Как мне объяснили, учитывая:
[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
Ответ 4
Двумя уровнями константы являются: * Низкоуровневая 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 имеет много информации о том же !!!