Что такое const-квалификаторы верхнего уровня? - PullRequest
43 голосов
/ 27 октября 2011

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

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

Например:

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

Ответы [ 4 ]

54 голосов
/ 27 октября 2011

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

char x;
char const* p = &x;

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

*const_cast<char*>( p ) = 't'

является законным и четко определенным.

Но

char const x = 't';
char const* p = &x;

На этот раз есть константа верхнего уровня на x, поэтомуx является неизменным.Никакое выражение не может изменить его (даже если используется const_cast).Компилятор может поместить x в постоянную память, и он может предположить, что значение x никогда не меняется, независимо от того, что может делать другой код.*, вы бы написали:

char x = 't';
char *const p = &x;

В этом случае p будет указывать на x навсегда;любая попытка изменить это - неопределенное поведение (и компилятор может поместить p в постоянную память или предположить, что *p относится к x, независимо от любого другого кода).

12 голосов
/ 27 октября 2011

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

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

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

6 голосов
/ 25 августа 2015

То, как мне это объяснили, дано:

[const] TYPE * [const] VARIABLE

VARIABLE используется для указания на данные типа TYPE - *VARIABLE

Проведите линию через * или несколько * s

  1. Если есть const до слева из *, это относится к данные и данные не могут быть изменены: *VARIABLE не может быть назначено, кроме как при инициализации
  2. Если есть 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
2 голосов
/ 27 июля 2018

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

const int *pc (низкоуровневое const): Указатель на Const не может использоваться для внесения изменений в базовый объект, но сам может быть переназначен.

const int *const cpc (как верхний, так и низкоуровневый const): 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*

Надеюсь, это помогло :) К вашему сведению: C ++ Primer содержит много информации об этом !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...