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

Что означает const на «верхнем уровне» в C ++?

И что такое другие уровни?

Например:

 int const *i; int *const i; int const *const i; 

Определяющий атрибут const верхнего уровня влияет на сам объект. Другие относятся только к указателям и ссылкам. Они не создают объект const и только предотвращают модификацию по пути с помощью указателя или ссылки. Таким образом:

 char x; char const* p = &x; 

Это не константа верхнего уровня, и ни один из объектов не является неизменным. Выражение *p не может использоваться для изменения x , но могут быть другие выражения; x не const. В этом отношении

 *const_cast( 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 навсегда; любая попытка изменить это – неопределенное поведение (и компилятор может поместить p в постоянную память или предположить, что *p относится к x , независимо от любого другого кода).

int *const i ставит const на верхнем уровне, тогда как int const *i нет.

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

Всякий раз, когда const появляется непосредственно перед или после типа идентификатора, это считается квалификатором верхнего уровня.

Как мне объяснили, учитывая:

 [const] TYPE * [const] VARIABLE 

Переменная VARIABLE используется для указания данных типа TYPE через *VARIABLE

Нарисуйте линию через * или несколько * s

  1. Если в левой части * есть константа, она применяется к данным, и данные не могут быть изменены: *VARIABLE не может быть назначено, кроме как при инициализации
  2. Если есть const справа от * она применяется к переменной 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 *cp (const-const): указатель Const может использоваться для внесения изменений в базовый объект, но не может быть переназначен. (Невозможно изменить его, чтобы указать на другой объект.)

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

  • Как инициализировать переменную const member в classе?
  • Невозможно освободить константные указатели в C
  • Как его срок службы возвращаемого значения распространяется на область действия вызывающей функции, когда она привязана к константной ссылке в вызывающей функции?
  • Окончательный вариант Java против C ++ const
  • В чем разница между #define и const?
  • C ++ typedef интерпретация константных указателей
  • C ++ Const Использование Объяснение
  • Постоянный указатель vs Указатель на константу
  • Измененный массив в области файлов
  • const &, & и && спецификаторы для функций-членов в C ++
  • Что означает «const» в конце объявления функции?
  • Давайте будем гением компьютера.