什么是顶级常量限定符? >“顶级”限定符中的 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*