什么时候为只读变量?什么时候是常量?
const常量的判别标准
— 只有用字面量初始化的const常量才会进入符号表
— 使用其他变量初始化的const常量仍然是只读变量
— 被volatile修饰的const常量不会进入符号表
const int x = 1; //(1)
const int& rx = x; //(2)
int& nrx = const_cast<int&>(rx); //(3)
nrx = 5; //(4)
volatile const int y = 2; //(5)
int* p = const_cast<int*>(&y); //(6)
*p = 6;
(1) x为只读常量,在符号表中,C++为了兼容C,也在内存中为x分配 了内存,但一般情况下 不用;
(2)定了了rx为x的引用,与编译器为x分配的内存地址同名;
(3) 用const_cast进行强制类型转换,解除了rx的const只读属性,nrx与 rx为同一处内存地址;
(4) 修改nrx的值为5,rx的值也是5,但是x还是1,因为x在编译期间就确定了,在符号表中;
(5)volatile修饰了const变量y,所以y不会进入符号表,而是作为普通的只读变量;
(6)p是应该const_cast强制转换后指针,指向y的地址,经过const_cast转换后,消除了只读属性,所以*p = 6; y = 6。
在编译期间不能直接确定初始值的const标识符,都被作为只读变量处理
const引用的类型与初始化变量的类型
— 相同:初始化变量成为只读变量
— 不同:生产一个新的只读变量
char c = 'c';
char& rc = c;
const int& trc = c;
rc = 'a';
//trc与c类型不同,将产生一个新的只读变量,最终结果为:
c = 'a'; rc = 'a'; trc = 'c';
http://note.youdao.com/share/?id=24f16999a9642b51951a695f998c2b43&type=note#/