const_cast和static_cast

 const_caststatic_cast

Static_cast可以对对象也可以对指针也可以对引用,但是const_cast只可以对指针和引用使用,后者不可以对对象用,如果你要把一个const值转化为非const值只能用隐式执行或通过使用static_castC 样式转换或函数样式转换执行。

比如:

   const int aa = 10;

   //int bb = const_cast<int>(aa);错误

int bb = int(aa);//传统的c转化方式

如果是指针使用就有一个返回的对象要是一个指针,结果指针是指向原指针的,但是不可以认为原来的指针性质已经变化了,依旧不可以直接改变他的值,但是可以通过结果指针改变,引用一样:

  int p = 20;

  const int *pp = &p;

  int *ppp = const_cast<int *>(pp);

  *ppp = 30;

  //*pp = 40;错误,但是可以通过PPP来改变pp的值

cout << *pp << p <<endl; //3030

对于引用也存在这个问题:

  int c = 10;

  const int &a  = c;

  int &b = const_cast<int &>(a);

  cout << a << b << c <<endl;//101010

//a = 12;

  b = 12;

cout << a << b << c <<endl;//121212

记住一点,就是cast<>的尖括号里面的一定要是对应的如果本身是指针就用指针,是引用就要用引用。

可以看到上面的b可以改变a乃至c的值,但是不能通过a来改变,因为a仍旧常量。

还要注意一个问题就是返回的值不是传给引用,还是可以成功的,相当于转化后的值产生了一个临时中间值,传给了结果值!如下:

  int c = 10;

  const int &a  = c;

  int b = const_cast<int &>(a); //临时变量出现

  cout << a << b << c <<endl; //101010

  //a = 12;

  b = 12;

cout << a << b << c <<endl;//101210

你可能感兴趣的:(c)