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

Что означает 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?
  • __ атрибут __ ((const)) vs __attribute __ ((чистый)) в GNU C
  • const vs constexpr для переменных
  • Какая оптимизация предлагает const в C / C ++? (если есть)
  • Должен ли компилятор указывать / предупреждать при передаче экземпляров объекта непосредственно в качестве параметров интерфейса const?
  • Разница между константой const и нормальным параметром
  • Почему «extern const int n» не работает должным образом?
  • Использование 'const' для параметров функции
  • Функции с аргументами const и перегрузкой
  • Измененный массив в области файлов
  • C - Доступ к объявлению const без константы
  • Interesting Posts

    # включить все .cpp-файлы в единый блок компиляции?

    Dreamweaver отключает обнаружение «языка для не-Unicode-программ»

    Может ли командная строка Windows поддерживать Linux «cd -»?

    Конструктор абстрактного classа в C #

    Что такое тестирование на дым и что он будет делать для меня?

    Ошибка проверки ключа хоста Jenkins

    Как сделать брандмауэр Windows 7 блокировать весь трафик

    Как сделать внешние HTTP-запросы с помощью Node.js

    Windows 8 не может подключиться к беспроводной сети WPA2 AES

    Как точно определить, какие действия с файлом будут отменены при выполнении отмены в проводнике Windows?

    Получение ssh для выполнения команды в фоновом режиме на целевой машине

    Можно ли ограничить память, которую приложение может использовать?

    R: извлечение «чистого» текста UTF-8 с веб-страницы, очищенной с помощью RCurl

    Композиция Monads v. Аппликативные функторы

    iPhone – UIWebview – Получите URL-адрес ссылки, нажатой

    Давайте будем гением компьютера.