什么是顶级常量限定符? >“顶级”限定符中的 const 意味着C++?
其他级别是什么 例如:什么是顶级常量限定符? >“顶级”限定符中的 const 意味着C++?,c++,constants,C++,Constants,其他级别是什么 例如: int const *i; int *const i; int const *const i; 顶级常量限定符会影响对象本身。其他的只是 与指针和引用相关。他们不制造物体 常量,并且仅阻止使用指针或 参考资料。因此: char x; char const* p = &x; 这不是一个顶级常量,并且没有一个对象是不可变的。 表达式*p不能用于修改x,但可用于修改其他表达式 可以x不是常量。就此而言 *const_cast<char*>( p ) =
int const *i;
int *const i;
int const *const i;
顶级常量限定符会影响对象本身。其他的只是 与指针和引用相关。他们不制造物体 常量,并且仅阻止使用指针或 参考资料。因此:
char x;
char const* p = &x;
这不是一个顶级常量,并且没有一个对象是不可变的。
表达式*p
不能用于修改x
,但可用于修改其他表达式
可以<代码>x不是常量。就此而言
*const_cast<char*>( p ) = 't'
这一次,x
上有一个顶级常量,因此x
是不可变的。不
允许表达式更改它(即使使用了const\u cast
)。这个
编译器可能将x
放在只读内存中,并可能假定
无论其他代码执行何种操作,x
的值永远不会更改
要使指针为顶级常量
,您需要编写:
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
变量用于通过*变量
在*
或多个*
中画一条线
如果*
的左侧有常量
,则适用于
数据和数据不能更改:*变量
不能赋值,除非在初始化时
如果*
的右侧有常量
,则适用于
变量和变量指向的对象不能更改:变量
不能赋值,初始化时除外
因此:
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
(顶级和低级常量):指向常量的常量指针既不能用于更改基础对象,也不能重新分配自身
此外,顶级常量在分配给另一个对象时总是被忽略,而低级常量不会被忽略
int i = 0;
const int *pc = &i;
int *const cp = &i;
int *p1 = cp; // allowed
int *p2 = pc; // error, pc has type const int*
希望这有帮助:)
FIY:C++底漆有很多关于同一个的信息!!!p> 我不知道你所说的示例是什么意思,但我添加了一些我熟悉的常量限定符。还可以看到另一点:在编写函数时,参数的顶级限定符被丢弃。这意味着void foo(char const)
和void foo(char)
是相同的函数(实际上它们可以互换)。原因是,由于参数是通过副本获取的,调用方不关心副本是否可以修改,因此对她来说是透明的。@MatthieuM。这一点很好,尽管并不像上面所说的那样完全正确。在声明和函数类型中忽略顶级限定符。但是,在定义中,它们在函数中的行为仍然与往常一样。(在匹配异常以捕获时,typeid
和模板参数也会忽略顶级限定符,在其他一些情况下,我可能已经忘记了。实际上,它们对非类类型返回值也没有影响。)关于最后一个示例,使用const p
:p=0
试图更改p
,但它没有未定义的行为,只是格式不正确。const
绑定到左侧。除非左边什么都没有,否则它将绑定到右边优秀而清晰的答案。P.S.int-const*i
等于const-int*i
(都是低级常量)。我使用int*I
(低级)更经常地将其常量级别与int*const I
(顶级)区分开来。我很难理解“每当常量出现在标识符类型之前或之后时,就被认为是顶级限定符。”这不适用于<代码> int const *i/c>因为<>代码> const 出现在标识符的类型中间,在这种情况下是代码> int */COD>。谢谢,这是最清楚的解释。顺便说一下,C++底漆是我的书。
int i = 0;
int *p = &i;
int *const cp = &i;
const int *pc = &i;
const int *const cpc = &i;
int i = 0;
const int *pc = &i;
int *const cp = &i;
int *p1 = cp; // allowed
int *p2 = pc; // error, pc has type const int*