Подтвердить что ты не робот

Что такое квалификаторы верхнего уровня?

Что означает const в квалификаторе верхнего уровня в С++?

И какие еще уровни?

Например:

int const *i;
int *const i;
int const *const i;
4b9b3361

Ответ 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 имеет много информации о том же !!!