《C++ primer》学习笔记之十五:四个cast

来源:互联网 发布:速食汤 知乎 编辑:程序博客网 时间:2024/06/05 14:09

四个cast的形式:T t = xx_cast<T>(expression)
 不要忘了expression要用括号隔开,不向sizeof


 const_cast: 去掉const修饰,即用来将指向const对象的指针转为指向普通对象的指针
  T t;
  T const * const_pt = &t;
  T *pt = const_pt;     //error
  T *pt2 = const_cast<T*>(const_pt); //ok
  其它的cast不能去掉const修饰。


 static_cast: 将隐式转换显示话。
  隐式转换有:standard :int -> double
     user-define : 通过类的构造函数、重载conversion编译器可以将一种类型转为另一种类型
  这个要求两类型间能够作隐式转换。如果这个不符,则编译通不过。
  如:T t;
   t = 3; //3 -> T
   t = static_cast<T>(3);
  这个使程序更清晰,不用也行。


 dynamic_cast:将指向类型T的指针(或引用)转为指向类型S的指针(或引用)。
  要求两类型都为class,且待转换的类型T为多态类型,即含virtual成员函数,如果不是,则编译通不过;目标类型不必是多态类型。
  如果待转换的指针指向的对象是一个目标类型(比如为其子类)的对象,则转换成功;否则转换失败,返回0.
  class Base
  {
  public: ~Base(){}
  };
  class Derived: public Base {};
  
  Base b;
  Base *pb = &b;
  Derived *pd = dynamic_case<Derived*>(pb); //待转换的类型为Base *,为多态类型


 reinterpret_cast:无理转换。即要求编译器将两种无关联的类型作转换。
  char *buf = new char[1024];
  T *bt = reinterpret_cast<T*>(buf); //T与char无关联
  T *bt = (T*)(buf); //这个是c-style
 
 上面的4种cast都可以用c-style的风格写:T t = (T)(expression);