c++从入门到精通——静态类型转换static_cast与动态类型转换dynamic_cast

类型转换

强制转换运算符是一种特殊的运算符,它把一种数据类型转换为另一种数据类型。强制转换运算符是一元运算符,它的优先级与其他一元运算符相同。

大多数的 C++ 编译器都支持大部分通用的强制转换运算符:

(type) expression 

其中,type 是转换后的数据类型。下面列出了 C++ 支持的其他几种强制转换运算符:

const_cast (expr): const_cast 运算符用于修改类型的 const / volatile 属性。除了 const 或 volatile 属性之外,目标类型必须与源类型相同。这种类型的转换主要是用来操作所传对象的 const 属性,可以加上 const 属性,也可以去掉 const 属性。

reinterpret_cast (expr): reinterpret_cast 运算符把某种指针改为其他类型的指针。它可以把一个指针转换为一个整数,也可以把一个整数转换为一个指针。

dynamic_cast<type> (expr): 动态类型转换dynamic_cast 在运行时执行转换,验证转换的有效性。如果转换未执行,则转换失败,表达式 expr 被判定为 null。dynamic_cast 执行动态转换时,type 必须是类的指针、类的引用或者 void*,如果 type 是类指针类型,那么 expr 也必须是一个指针,如果 type 是一个引用,那个 expr 也必须是一个引用。

static_cast<type> (expr): 静态类型转换static_cast 运算符执行非动态转换,没有运行时类检查来保证转换的安全性。例如,它可以用来把一个基类指针转换为派生类指针。

静态类型转换

在这里插入图片描述

//父子之间转换
class Base{};
class Child :public Base{};
class Other{};
void test02()
{
	Base * base = NULL;
	Child * child = NULL;

	//把base转为 Child*类型 向下  不安全
	Child * child2 = static_cast<Child*>(base);

	//把child 转为 Base*  向上  安全
	Base * base2 = static_cast<Base*>(child);

	//转other类型 转换无效
	//Other * other = static_cast<Other*>(base);
}

动态类型转换

基础类型不可以转换

在这里插入图片描述

void test03()
{
	//基础类型不可以转换
	char c = 'a';
	//dynamic_cast非常严格,失去精度 或者不安全都不可以转换
	double d = dynamic_cast<double>(c);

}

动态类型转换

在这里插入图片描述
如果发生了多态

class MyBase
{
	virtual void func(){};
};
class MyChild :public MyBase
{
	virtual void func(){};
};
class MyOther {};

void test05()
{
	MyBase* base = NULL;
	MyChild* child = NULL;

	//child转Base *  向上 安全   
	MyBase* base = dynamic_cast<MyBase*>(child);


	//base 转MyChild *  向下 不安全
	//MyChild* child = dynamic_cast<MyChild*>(base);

	//dynamic_cast 如果发生了多态,那么可以让基类转为派生类 ,向下转换
	MyBase* base = new MyChild;
	MyChild* child = dynamic_cast<MyChild*>(base);

}

总结

不可以转换基础数据类型
父子之间转换说明

 父转子 不可以
 子转父 可以
 发生多态 都可以

参考

强制类型转换
C++ static_cast、dynamic_cast、const_cast和reinterpret_cast(四种类型转换运算符)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值