您的位置:首页 > 编程语言 > C语言/C++

C++ static_cast dynamic_cast const_cast reinterpret_cast使用总结

2017-09-09 14:38 246 查看
因为原来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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: