C++ static_cast dynamic_cast const_cast reinterpret_cast使用总结

来源:互联网 发布:震楼神器 淘宝 编辑:程序博客网 时间:2024/06/06 03:22
因为原来C风格的暴力万能类型转换容易导致运行时出错,所以要引入分类更清晰提前发现错误的转换语法。
对象的类型转换包含了对象的引用或指针。
1.static_cast是编译器默认选项,该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。
但是没有动态检查所以类对象间非直线继承转换不支持(无关对象指针类型),C风格的转换确是可以的,所以并不是C风格转换的替代品。
所以基本类型转换,类上行转换(类的下行转换有隐患),把其它类型转换为void*都是安全的(void*转换为目标类型就要小心了)。

2.dynamic_cast是动态类型转换提前检查:
该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void*
1)下行转换,兄弟之间转换,动态实例到当前指针非直线继承转换
如果不安全(父实例不能下行,兄弟实例不能相互转换),那么会提前得到空指针。
如果安全,那么下行转换和对象间非直线继承转换(包括上行)还需要有虚函数,才支持动态转换(实例合理则不为空),一般继承中都用虚析构函数故基本是没问题的。
2).上行转换和多继承情况:
多继承中,多条路径时候需要多次dynamic_cast指定以表明用具体路径进行转换

3.const_cast一般将常量转换为非常量指针,用非常量指针对数据进行修改。该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。

4.reinterpret_cast是将一种类型无位损失的转换为另一种类型例如字符串转换为整型,他们的内存结构会是一样的,也可以把一种类型转换为*void再由于*void转换回该类型。
type-id 必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。
特别是开辟了系统全局的内存空间,需要在多个应用程序之间使用时,需要彼此共享,传递这个内存空间的指针时,就可以将指针转换成整数值,得到以后,再将整数值转换成指针,进行对应的操作

测试实例:
class A
{
public:
int a;
A()
{
a = 0;
}
virtual void display()
{
cout<< "I am A"<<endl;
}
virtual ~A()
{
}
};

class AImpl: public A
{
public:
int b;
AImpl()
{
b = 0;
}
virtual void display()
{
cout<< "I am AImpl"<<endl;
}
virtual ~AImpl()
{
}
};

class B: public AImpl
{
public:
int b;
B()
{
b = 0;
}
virtual void display()
{
cout<< "I am B"<<endl;
}
virtual ~B()
{
}
};

class C:public AImpl
{
public:
int a;
C()
{
a = 0;
}
virtual void display()
{
cout<< "I am C"<<endl;
}
virtual ~C()
{
}
};


class D: public B,public C
{
virtual void display()
{
cout<< "I am D"<<endl;
}
};

int main( int argc, char *argv[] )
{
D *d = new D();
B *b =dynamic_cast<B*>(d);
A *a = dynamic_cast<A*>(b);
AImpl *aimp= dynamic_cast<AImpl*>(a);
aimp->display();
}

reference:
http://www.cplusplus.com/doc/tutorial/typecasting/
https://msdn.microsoft.com/en-us/library/cby9kycs

阅读全文
0 0
原创粉丝点击