什么是顶级const限定符?

C ++中“顶级”限定符的const是什么意思?

其他的水平是什么?

例如:

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

顶级const限定符影响对象本身。 其他只与指针和引用相关。 它们不会使对象成为常量,只能通过使用指针或引用的path来防止修改。 从而:

 char x; char const* p = &x; 

这不是一个顶层的const,并且这些对象都是不可变的。 expression式*p不能用于修改x ,但其他expression式可以是; x不是const。 对于这个问题

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

是合法的和明确的。

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

这一次,在x上有一个顶级的const,所以x是不可变的。 不允许expression式改变(即使使用const_cast )。 编译器可以将x放在只读存储器中,并且可以假定x的值永远不会改变,而不pipe其他代码可以做什么。

为了给这个指针顶层的const ,你会写:

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

在这种情况下, p将永远指向x 。 任何改变这个的尝试都是未定义的行为(并且编译器可以把p放在只读存储器中,或者假设*p指的是x ,而不pipe其他任何代码)。

int *const iconst放在顶层,而int const *i不会。

第一种说法是指针本身是不可变的,而第二种指出指针指向的内存是不可变的。

每当const出现在标识符的types之前或之后,这被认为是一个顶级限定符。

给我解释的方式,给出:

 [const] TYPE * [const] VARIABLE 

VARIABLE用于通过*VARIABLE指向TYPEtypes的 数据

通过*或多个* s画一条线

  1. 如果*左边有一个const ,它将应用于数据 ,并且数据不能被改变: *VARIABLE不能被赋值,除了初始化
  2. 如果*右边有一个const ,它就会应用于VARIABLEVARIABLE指向的内容不能被改变:除了初始化之外, 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