什么是顶级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 i
把const
放在顶层,而int const *i
不会。
第一种说法是指针本身是不可变的,而第二种指出指针指向的内存是不可变的。
每当const
出现在标识符的types之前或之后,这被认为是一个顶级限定符。
给我解释的方式,给出:
[const] TYPE * [const] VARIABLE
VARIABLE用于通过*VARIABLE
指向TYPEtypes的 数据
通过*
或多个*
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