在通过const
声明工作时,您向后看。不幸的是,它有一个例外:由于历史原因允许使用const int
,但它意味着与int const
相同。
下面,const
“回顾”到int
因此p
指向一个不能更改的int。
int const * p;
而在这里,在const
“回顾”的int *
所以p
不允许指向任何东西,但它指向什么,现在可以通过p
改变。
int i = 5; int j = 5;
int * const p = &i;
*p = 6; // ok, you can still modify `i` through `p`
p = &j; // error because you can't change what `p` points at
而这里,p
是const int指针。 p
不允许更改,它指向的内容不能更改。
int i = 5; int j = 5
int const * const p = &i;
*p = 6; // error, promised not to makes changes through `p`
p = &j; // error `p` is stuck to `i`
当将一件事分配给另一件事时,规则是承诺不能被破坏。 int const
是承诺int
永远不会改变。如果你试试这个:
int const i = 5;
int * p = &i; // error
和编译器让你做到这一点,那么您需要能够打破i
绝不会做改变的诺言这个
*p = 6;
现在i
将被改变从5到6,打破了i
永不改变的承诺。
没关系,因为你没有违反任何承诺。在这种情况下,你只能保证不会修改i
当你通过指针p
int i = 5;
int const * p = &i;
*p = 6; // error, because we promised not to change `i` through `p`
i = 6; // ok, because `i` itself is not const
const
访问它是重要的,因为内置的安全检查。如果您声明为const
的内容发生更改,编译器会给您一个错误。您可以将类的方法声明为const
,这是承诺该类中的数据不会被该方法更改。很容易忘记并稍后修改该方法来更改类中的某些内容,但编译器会提醒您。
这对优化也很重要。如果编译器知道某事是const
它可以做出很多简化的假设来加速代码。
我不明白你的问题..你有什么困惑? – immibis
您的问题的标题似乎与问题的内容无关。我没有看到任何关于复制对象的问题。 –
我没有得到处理引用的最后两条语句。规则即忽略顶级常量在这里似乎不起作用。 –