一 const、const_cast、volatile
int v1 = 0;
volatile const int v2 = 0;//必须加volatile,不让后面会出现改变值后,依然cout 出原值的情况。
int v3 = 8;
const int* p1 = &v1;//仅*p2为const,p1仍然为非const,仍然可以赋值。见下面赋值
p1 = &v3;
const int* const p5 = &v1;//p5,*p5 均为const.
//int* p3 = &v2;//error.无法从“const int *”转换为“int *”,因为v2 是const,*p3 是非const
int* p4 = const_cast<int*>(&v2);//const_cast 转化得到一个新的去掉了const的指针p4,指针仍然指向v2内存。v2本身const不会变。值也不会变。只能通过*p4访问变化后的值。
*p4 = 6;
std::cout << v2 << std::endl;//v2 前不加volatile的话,debug下v2 是6,cout 出来却是0.
int* const p6 = &v1;
//p6 = &v1;//error,“p6”: 不能给常量赋值
*p6 = v2;//指向的内存仍然可以赋值。
int p7 = const_cast<int&>(v2);
p7 = 9;
int h = v2;
//std::cout << p7 << " " << v2 << std::endl;
int* p8 = (int*)&v2;
。
小结:const 放最前面修饰整个表达式的时候(const int* p),说明指针指向的内存为常量,后继不可对此内存继续赋值,但是指针本身内存是可以赋值的。const 放指针前修饰的时候(int* const p),指针本身为常量,指针后续不可赋值。
const_cast<type>(expression) 可以把type转化为不带const的变量。且仍指向原内存。
特别注意,volatile 字段对const_cast 转化后的指针的影响。