关于const的疑问

来源:互联网 发布:做网站需要会编程吗 编辑:程序博客网 时间:2024/05/24 05:04

什么时候为只读变量?什么时候是常量?

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#/