C++的四种转型小结

static_cast

static_cast应该是适用范围最广的,适用于很多隐式转换,基类指针与子类指针的相互转换,或者添加const属性,去掉const属性应该用const_cast

double a = 10.23int b = static_cast<int>(a);
Base *ptr = new Child();
Child ptr2 = static_cast(ptr);
const Base *ptr3 = static_cast<const Base*>(ptr)

但是需要注意的是,static_cast 在执行基类的指针转换为派生类的指针时( 即向下转型),此类转换并非始终安全。这时应该使用dynamic_cast,如果是向上转型,则两者效果相同。

dynamic_cast

dynamic_cast转换符只能用于指针或者引用。dynamic_cast转换符只能用于含有虚函数的类。dynamic_cast转换操作符在执行类型转换时首先将检查能否成功转换,如果能成功转换则转换之,如果转换失败,如果是指针则反回一个0值,如果是转换的是引用,则抛出一个bad_cast异常,所以在使用dynamic_cast转换之间应使用if语句对其转换成功与否进行测试,比如pd = dynamic_cast(pb); if(pd){…}else{…},或者这样测试if(dynamic_cast(pb)){…}else{…}。

Base *ptr = new Base();
Child * ptr2 = dynamic_cast(ptr);
if(!ptr2)
    cout<

ptr指针指向的是基类,转化为子类指针肯定会引发问题,所以这个时候我们应该使用dynamic_cast进行检查,这样可以避免盲目转换。

const_cast

用来将对象的常量性去除

reinterpret_cast

它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成原类型的指针,还可以得到原先的指针值),或者把一种指针转为另一种指针

你可能感兴趣的:(c++)