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
}
关于类型转换,首先说明一下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
}