关于 const 的疑问
const 什么时候为只读变量?什么时候为常量?
const 常量的判别标准
只有用字面量初始化的 const 常量才会进入符号表 (const 引用除外)
使用其他变量初始化的 const 常量仍然是只读变量
被 volatile 修饰的 const 常量不会进入符号表
在编译期间不能直接确定初始值的 const 标识符,都被作为只读变量处理
const 引用的类型与初始化变量的类型
- 相同:初始化变量为只读变量
- 不同:生产一个新的只读变量
const 经典问题分析
#include <stdio.h>
int main()
{
const int x = 1;
const int& rx = x;
int& nrx = const_cast<int&>(rx);
nrx = 5;
printf("x = %d\n", x);
printf("rx = %d\n", rx);
printf("nrx = %d\n", nrx);
printf("&x = %p\n", &x);
printf("&rx = %p\n", &rx);
printf("&nrx = %p\n", &nrx);
volatile const int y = 2;
int* p = const_cast<int*>(&y);
*p = 6;
printf("y = %d\n", y);
printf("p = %p\n", p);
const int z = y;
p = const_cast<int*>(&z);
*p = 7;
printf("z = %d\n", z);
printf("p = %p\n", p);
char c = 'c';
char& rc = c;
const int& trc = c;
rc = 'a';
printf("c = %c\n", c);
printf("rc = %c\n", rc);
printf("trc = %c\n", trc);
return 0;
}
第 5 行,用字面量初始化 const 常量 x,x 的值会进入符号表,出现 x 的地方,编译器直接用 1 来替换 (x 被引用或取地址除外,这种情况编译器会为 x 分配内存空间,但 x 不会使用这个内存空间)
第 6 行,常量 x 被引用,编译器会为 x 分配内存空间,但 x 不会使用这个内存空间,所以 x 的值还是为 1
第 19 行,被 volatile 修饰的 const 常量 y 不会进入符号表
第 27 行,用只读变量初始化 const 常量 z,z 是只读变量
第 38 行,const 引用的类型和初始化变量的类型不同,编译器会为 c 生成一个新的变量,新的变量的值和 c 一样,为 'c', trc 引用的不是 c,而是新的变量