const
限定符
使用 const
修饰普通类型的变量
在上面的代码中, int
类型的 a
被修饰为了 const
, 因此, a
的值是无法被改变的.
即使通过其他方法强制改变 a
的值, 编译器依然会认为 a
的值是 2
, 虽然实际上 a
所在地址上的值已经被改变.
见如下的代码:
#include <iostream>
#include <assert.h>
using namespace std;
int main(){
const int a = 7;
int *b = (int *)a;
*b = 8;
cout << a << " " << *b << endl;
assert(&a == b);
return 0;
}
// ---------- output ----------
> g++ const-test.cpp -o const-test
> const-test
7 8
a
为 7
, b
为 8
, 并且没有触发 assert
, 说明 a
所在的地址和 b
所指向的地址是一致的.
如果实在想要修改 a
的值, 可以再使用 volatile
关键字修饰: volatile const a = 7
, 此时的输出结果就变成了 8 8
, 因为被 volatile
修饰的变量, 在每一次使用前, 都会从内存中重新读取.
使用 const
修饰引用
引用的实质是别名, 并不会在内存中开辟新的空间, 使用引用, 实际上就是在使用原对象. 即使是对于普通的引用, 在声明后, 也无法修改其引用对象.
使用 const
修饰指针变量
使用 const
修饰指针变量存在三种情况:
1. const
修饰指针所指向的内容: (const int)* (p)
2. const
所修饰指针的值: (int)* const p
-> 可以理解为这是一种特殊的 const
用法, 所
3. const
修饰指针和指针指向的内容: const int* const p
可以理解为, 把 *
放在 const
前, 表明指针是一个常量, 总之可以理解为: 左定值, 右定向