一、只有用字面量初始化的const常量才会进入常量符号表:
1、对const常量取引用,会导致编译器为其分配内存空间;
2、虽然编译器为其分配了内存空间,但是这个空间中的值不会被使用,还是会去使用常量符号表中的值;
3、使用其他变量初始化的const常量仍然是只读变量,不会进入常量符号表;
代码如下:
int main(void) {
const int x = 0;//字面量初始化的const常量才会进入常量符号表
int& rx = const_cast<int&>(x);//对const常量取引用,会导致编译器为其分配内存空间
rx = 6;
int y = 1;
const int z = y;//使用其他变量初始化的const常量仍然是只读变量
int* p = (int*)&z;
*p = 9;
printf("x = %d\n", x);//虽然编译器为其分配了内存空间,但是这个空间中的值不会被使用,还是会去使用常量符号表中的值
printf("rx = %d\n", rx);
printf("&x = %p\n", &x);
printf("&rx = %p\n", &rx);
printf("z = %d\n", z);
cout << endl;
printf("Press Enter Key to Continue... ...");
getchar();
return 0;
}
执行结果如下图:
二、被volatile修饰的const常量不会进入常量符号表,而是退化为只读变量,每次访问都从内存中取值:
代码如下:
int main(void) {
volatile const int y = 2;//使用volatile,导致y未进入常量符号表 ,而是进入内存空间;
int* p = const_cast<int*>(&y);
*p = 9;
printf("y = %d\n", y);
printf("*p = %d\n", *p);
printf("&y = %p\n", &y);
printf("p = %p\n", p);
printf("Press Enter Key to Continue... ...");
getchar();
return 0;
}
代码执行结果如下:
三、const引用的类型与初始化变量的类型:
相同:使初始化变量成为只读变量;
不同:生成一个新的只读变量,其初始值与初始化变量相同;
代码如下:
int main(void) {
char c = 'c';
char& rc = c;
const int& trc = c;//const引用的类型与初始化变量的类型不同,这里将在一块新的内存地址产生一个新的只读变量;
int* ptr = (int*)&trc;
rc = 'g';
*ptr = 'k';
printf("c = %c\n", c);
printf("rc = %c\n", rc);
printf("trc = %c\n", trc);
printf("&c = %p\n", &c);
printf("&rc = %p\n", &rc);
printf("&trc = %p\n", &trc);
printf("Press Enter Key to Continue... ...");
getchar();
return 0;
}
代码执行结果如下: