bma*_*ies 21
一般const是100%编译器.当你声明一些const时,编译器会限制你可以编写的内容.它不会让你分配给const标量,通过const引用或或指针赋值,或者调用const对象的非const函数.
无法保证编译器会安排任何类型的运行时保护.
AnT*_*AnT 10
const C和C++中的关键字有两种不同的语义含义.
(1)它可以声明对象的常量
const SomeType t;
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,对象t是一个不可修改的对象.编译器将尽力阻止您通过观察const-correctness规则(在C和C++中不同)来修改它.const-correctness规则仅在概念上强制执行,在语言级别,这意味着有办法绕过这些规则,这也意味着对象的constness不一定在物理层面实现.即,不能保证对象最终将被放置在只读存储器中.
重要的是要注意,这种常量在某种意义上是不可移除的,因为任何通过抛弃const修改上述对象的尝试都会导致未定义的行为(mutable在C++中排除可能的成员).
(2)它可以声明对象访问路径的常量
const SomeType *p;
Run Code Online (Sandbox Code Playgroud)
以上内容p被声明为指向const的指针.这并不一定意味着对象p指向的是一个常量对象(由const上面的第一种定义).它可能很容易成为一个非常数的,在这种情况下,抛弃上述访问路径中的常量并修改对象是完全合法的,尽管它通常不是一个好的编程实践.换句话说,访问路径的常量可能是可移除的.
考虑到上述因素,以下声明
const int* const* const* const p = 0;
Run Code Online (Sandbox Code Playgroud)
包括两种不同的类型const:最后一个const声明对象的常量p(第一种),而其余的const声明由p(第二种)表示的各种级别的访问路径的常量.
PS作为一个[可能无关的]侧面注释,值得注意的是,术语常量在C和C++中具有截然不同的含义.在C++中,常量是声明为的对象const.在C 常量中是文字.声明为的对象在C术语const中不是常量.
| 归档时间: |
|
| 查看次数: |
2684 次 |
| 最近记录: |