reinterpret_cast,const_cast,static_cast

reinterpret_cast,const_cast,static_cast

  (2012-04-08 14:16:08)
转载
标签: 

杂谈

分类: C/CPlusPlus
static_cast
  用法:static_cast < type-id > ( expression )
  该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:
  ①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。
  进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;
  进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。
  ②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
  ③把空指针转换成目标类型的空指针。
  ④把任何类型的表达式转换成void类型。
  注意:static_cast不能转换掉expression的const、volatile、或者__unaligned属性。
  C++中static_cast和reinterpret_cast的区别
  C++primer第五章里写了编译器隐式执行任何类型转换都可由static_cast显示完成;reinterpret_cast通常为操作数的位模式提供较低层的重新解释
  1、C++中的static_cast执行非多态的转换,用于代替C中通常的转换操作。因此,被做为隐式类型转换使用。比如:
  int i;
  float f = 166.7f;
  i = static_cast<int>(f);
  此时结果,i的值为166。
  2、C++中的reinterpret_cast主要是将数据从一种类型的转换为另一种类型。所谓“通常为操作数的位模式提供较低层的重新解释”也就是说将数据以二进制存在形式的重新解释。比如:
  int i;
  char *p = "This is a example.";
  i = reinterpret_cast<int>(p);
  此时结果,i与p的值是完全相同的。reinterpret_cast的作用是说将指针p的值以二进制(位模式)的方式被解释为整型,并赋给i,//i 也是指针,整型指针;一个明显的现象是在转换前后没有数位损失。


const_cast
  用法:const_cast<type_id> (expression)
  该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。
  一、常量指针被转化成非常量指针,并且仍然指向原来的对象;
  二、常量引用被转换成非常量引用,并且仍然指向原来的对象;
  三、常量对象被转换成非常量对象。
  Voiatile和const类试。举如下一例:
  class B
  {
  public:
  int m_iNum;
  B() {}
  };
  void foo()
  {
  const B b1;
  //b1.m_iNum = 100; //compile error
  B b2 = const_cast<B&>(b1);
  
  B *b3 = const_cast<B*>(&b1);
  
  B &b4 = const_cast<B&>(b1);
  b2. m_iNum = 200; //fine?
  }
  int main()
  {
  foo();
  return 0;
  }
  上面的代码编译时会报错,因为b1是一个常量对象,不能对它进行改变;
  使用const_cast把它转换成一个非常量对象,就可以对它的数据成员任意改变。注意:b1和b2是两个不同的对象。

class BB
{
public:
int iMember;
const int const_iMember;
BB(void):const_iMember(1)
{
iMember = 0;
}
void display(void)
{
printf("%d\n", iMember);
}
void const_display(void) const
{
printf("%d\n", iMember);
}
};

void foo(void)
{
const BB b1;
BB b2 = const_cast<BB&>(b1);
BB *b3 = const_cast<BB*>(&b1);
BB &b4 = const_cast<BB&>(b1);

b2.iMember = 1;
b2.display();
b1.const_display();
//b1.iMember = 1;
b3->iMember = 2;
b3->display();
b1.const_display();
b4.iMember = 3;
b4.display();
b1.const_display();
}

int main(int argc, char* argv[])
{
int i;
char *p = "jiangtao";

i = reinterpret_cast<int>(p);
//i = p; //错误 "char *" to "int"
printf("p: %x\n", p);
printf("i: %x\n", i);

foo();

return 0;
}
输出结果:
p: 42513c
i: 42513c
1
0
2
2
3
3

你可能感兴趣的:(reinterpret_cast,const_cast,static_cast)