关于static_cast dynamic_cast reinterpret_cast的使用方法和场合
2012-06-07 12:28
351 查看
pret_cast可以转换任意一个32bit整数,包括所有的指针和整数。可以把任何整数转成指针,也可以把任何指针转成整数,以及把指针转化为任意类型的指针,威力最为强大!但不能将非32bit的实例转成指针。总之,只要是32bit的东东,怎么转都行!
static_cast和dynamic_cast可以执行指针到指针的转换,或实例本身到实例本身的转换,但不能在实例和指针之间转换。static_cast只能提供编译时的类型安全,而dynamic_cast可以提供运行时类型安全。举个例子:
class a;class b:a;class c。
上面三个类a是基类,b继承a,c和ab没有关系。
有一个函数void function(a&a);
现在有一个对象是b的实例b,一个c的实例c。
function(static_cast<a&>(b)可以通过而function(static<a&>(c))不能通过编译,因为在编译的时候编译器已经知道c和a的类型不符,因此static_cast可以保证安全。
下面我们骗一下编译器,先把c转成类型a
b& ref_b = reinterpret_cast<b&>c;
然后function(static_cast<a&>(ref_b))就通过了!因为从编译器的角度来看,在编译时并不能知道ref_b实际上是c!
而function(dynamic_cast<a&>(ref_b))编译时也能过,但在运行时就失败了,因为dynamic_cast在运行时检查了ref_b的实际类型,这样怎么也骗不过去了。
在应用多态编程时,当我们无法确定传过来的对象的实际类型时使用dynamic_cast,如果能保证对象的实际类型,用static_cast就可以了。至于reinterpret_cast,我很喜欢,很象c语言那样的暴力转换:)
dynamic_cast:动态类型转换
static_cast:静态类型转换
reinterpret_cast:重新解释类型转换
const_cast:常量类型转换
专业的上面很多了,我说说我自己的理解吧:
synamic_cast一般用在父类和子类指针或应用的互相转化;
static_cast一般是普通数据类型(如int m=static_cast<int>(3.14));
reinterpret_cast很像c的一般类型转换操作
const_cast是把cosnt或volatile属性去掉
static_cast和dynamic_cast可以执行指针到指针的转换,或实例本身到实例本身的转换,但不能在实例和指针之间转换。static_cast只能提供编译时的类型安全,而dynamic_cast可以提供运行时类型安全。举个例子:
class a;class b:a;class c。
上面三个类a是基类,b继承a,c和ab没有关系。
有一个函数void function(a&a);
现在有一个对象是b的实例b,一个c的实例c。
function(static_cast<a&>(b)可以通过而function(static<a&>(c))不能通过编译,因为在编译的时候编译器已经知道c和a的类型不符,因此static_cast可以保证安全。
下面我们骗一下编译器,先把c转成类型a
b& ref_b = reinterpret_cast<b&>c;
然后function(static_cast<a&>(ref_b))就通过了!因为从编译器的角度来看,在编译时并不能知道ref_b实际上是c!
而function(dynamic_cast<a&>(ref_b))编译时也能过,但在运行时就失败了,因为dynamic_cast在运行时检查了ref_b的实际类型,这样怎么也骗不过去了。
在应用多态编程时,当我们无法确定传过来的对象的实际类型时使用dynamic_cast,如果能保证对象的实际类型,用static_cast就可以了。至于reinterpret_cast,我很喜欢,很象c语言那样的暴力转换:)
dynamic_cast:动态类型转换
static_cast:静态类型转换
reinterpret_cast:重新解释类型转换
const_cast:常量类型转换
专业的上面很多了,我说说我自己的理解吧:
synamic_cast一般用在父类和子类指针或应用的互相转化;
static_cast一般是普通数据类型(如int m=static_cast<int>(3.14));
reinterpret_cast很像c的一般类型转换操作
const_cast是把cosnt或volatile属性去掉
相关文章推荐
- 关于static_cast dynamic_cast reinterpret_cast的使用方法和场合
- static_cast dynamic_cast reinterpret_cast const_cast 的区别和使用方法
- C++中四种类型转换运算符的使用方法(reinterpret_cast,const_cast,static_cast,dynamic_cast)
- C++中static_cast, dynamic_cast使用方法
- 关于方法CEikonEnv::Static()方法和宏iEikonEnv的使用区别
- 关于static 访问权限、继承、多态、内部类结合在一起时的使用方法
- c++ dynamic_cast与static_cast使用方法示例
- Java基础--关于static的变量和方法使用的一些不解
- static_cast使用场合
- 关于方法CEikonEnv::Static()方法和宏iEikonEnv的使用区别。
- 关于常见的变量修饰符: const, static, extern, register, auto 的详细解释,使用场合以及注意事项
- C++ 关于static_cast reinterpret_cast dynamic_cast 以及 const_cast 用于类型转换的函数使用 20180315 day7
- 关于static关键字的使用以及与成员方法、成员属性的总结
- 关于静态字段方法.const,static的使用
- 【C++基础】类型转换运算符的使用方法(reinterpret_cast、 const_cast、static_cast、dynamic_cast)
- static_cast dynamic_cast reinterpret_cast 使用准则 guide from stackoverflow
- 转【C++专题】static_cast, dynamic_cast, const_cast探讨 ---static_cast dynamic_cast const_cast reinpreter 设计原因
- C#中关于使用Uri来找项目中文件路径的方法
- 关于ajax的使用方法_例题、ajax的数据处理
- 关于Ibatis中的executeForObject方法使用时,需要考虑空的问题!