使用C++的各位想必对const都不陌生,在C++中这是个好用的关键字,但是平时使用时却存在一定误区,尤其是当你需要对它强制转型时。
#include<iostream>
int main(){
using namespace std;
const int num_a = 9;
int& p_num_a = const_cast<int&>(num_a);
p_num_a=1;
cout << p_num_a << " " << num_a << endl;
cout << &p_num_a << " " << &num_a << endl;
int num = 9;
const int num_b = num;
int& p_num_b = const_cast<int&>(num_b);
p_num_b = 1;
cout << p_num_b << " " << num_b << endl;
cout << &p_num_b << " " << &num_b << endl;
return 0;
}
猜一下答案是什么?
不知道各位是否有过类似的情况,其实第一种情况相当容易理解,因为C++中的const是常量,而不是C中定义的“值不变的变量”,也就是说C++中的const是没有内存空间的,仅仅是当作字面量处理了,是不是很像define?
但是为什么会出现第二种情况?让我们先来看一段GAS汇编码。
对比很容易发现多出了
movl $9 , 24(%esp) ; num=9
movl 24(%esp) , %eax ; eax=num
movl %eax , 12(%esp) ; num_b=num
可知此时的const由于上述代码,不能再将自己放进符号表,不再具备像define一样的特性,这样就具有了存储空间,因此我们对他修改的值,都在num_b中有直观反映。
因为C++里的const是内部链接的,所以如果我们使用extern const int num_b也能达到相同的效果。
有一点需要补充,C里的const也可能出现像C++一样的情况,这个是编译器优化造成的,所以只需要把优化级别降低就行了。