{+ 1}在“顶级”限定符中的含义是什么意思?
还有什么其他级别?
例如:
const
答案 0 :(得分:54)
顶级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
的值永远不会改变,无论其他代码可能做什么。
要给指针顶级const
,你要写:
char x = 't';
char *const p = &x;
在这种情况下,p
将永远指向x
;任何改变这种情况的企图
是未定义的行为(并且编译器可能将p
放在只读内存中,
或者假设*p
引用x
,无论其他代码如何。)
答案 1 :(得分:12)
int *const i
将const
置于顶层,而int const *i
则不会。{/ p>
第一个说指针i
本身是不可变的,而第二个指的是指针指向的内存是不可变的。
只要const
出现在标识符类型之前或之后,就会被视为顶级限定符。
答案 2 :(得分:6)
给我解释的方式,给出:
[const] TYPE * [const] VARIABLE
VARIABLE 用于指向 TYPE 类型的数据到*VARIABLE
在*
或多个*
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
答案 3 :(得分:2)
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 int *pc
(低级const):指向常量的指针不能用于对基础对象进行更改,但可以重新分配其本身。
const int *const cpc
(顶层和底层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有很多关于同一内容的信息!!!