C++ 中的类型转换(static_cast、dynamic_cast、reinterpret_cast、跟const_cast)

C++ 中的类型转换(static_cast、dynamic_cast、reinterpret_cast、和const_cast)
关于类型转换,首先说明一下C、C++中的不同:C中使用“括号”的方式进行强制类型转换;C++则是使用static_cast、dynamic_cast、reinterpret_cast、和const_cast进行强制类型转换。

接下来主要说明static_cast、dynamic_cast、和const_cast

1、static_cast这个和C里面的“括号”方式类似。
用法:static_cast < type-id > ( expression )
说明:该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。这个转型的过程是在编译期进行的!

2、dynamic_cast这个是比较重要的
首先,dynamic_cast是在运行时进行类型转换的,如果失败,则返回NULL。
其次,dynamic_cast主要是当不能使用virtual的时候发挥作用的。(我当时也不明白dynamic_cast的作用,后来才明白这一条的含义)。
例如:有两个类A、B,其中B是A的子类,当我们要给B增加新的方法(void newMethod())时,可以在A中定义virtual void newMethod(),这样通过多态就可以方便的实现;但是,当A不允许被修改的时候,我们只能在B中增加void newMethod(),然后在使用的时候通过dynamic_cast实现。
//如果A允许修改,则可以直接通过多态
void foo(A* a)
{
     a.newMethod();
}
//如果A不允许修改
void foo(A* a)
{
     B* b = dynamic_cast<B*>(a);
   
    //如果a实际指向一个B对象,dynamic_cast成功,并且开始指向B对象起始处
    if(b)
    {
        b.newMethod();
    }
    //如果pe不是实际指向Programmer对象,dynamic_cast失败,并且pm = 0
    else
    {
        //do other thing
    }

}

3、const_cast
是常量指针转成非常量。

class B{
public:
int m_iNum;
}

void foo(){

const* B b1 = new B();

//b1->m_iNum = 100; //编译错误

B* b2 = const_cast<B*>(b1);    //如果不使用const_cast则不能这样赋值

b2->m_iNum = 200; //ok
}