当前位置: 代码迷 >> 综合 >> c++ 中const、const_cast
  详细解决方案

c++ 中const、const_cast

热度:73   发布时间:2023-12-06 16:40:26.0

一 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 转化后的指针的影响。

  相关解决方案