C++之类型转换

目录

C语言中的类型转换

隐式类型转换

强制类型转换

C++中的类型转换 

static_cast

reinterpret_cast 

const_cast 

dynamic_cast


本期我们将学习C++中类型转换的相关知识点。

C语言中的类型转换

在C语言中,也有过类型转换的情景。

隐式类型转换

隐式类型转换其实也就是我们常说的相关类型的转换。

int main()
{

	int a = 10;
	double b = 20.1;
	b = a;
	return 0;	
}

a和b都是表示大小的相关变量,所以可以支持隐式类型转换。

强制类型转换

强制类型转换其实就是不相关类型的转换。

int main()
{

	int a = 10;
	int* p = &a;
	a =(int)p;
	
	return 0;	
}

a是变量,而p是变量的地址,所以两个变量是不相关的变量,就要进行强制类型转换。

C++中的类型转换 

C++中的类型转换与C语言中的类型转换是一样的吗,其实C++中的类型转换就是对C语言中的类型转换的引申与拓展。

C++中有四种类型转为,为static_cast,reinterpret_cast,const_cast,dynamic_cast

接下来,我们将详细的学习这四个类型。 

static_cast

static_cast是隐式类型转换,支持相关类型的转换。 

a和b是相关类型变量,所以支持隐式类型转换。 

reinterpret_cast 

 reinterpret_cast是强制类型转换,支持不相关类型的转换。

a和p是不相关类型,所以只能进行强制类型转换。 

const_cast 

const_cast支持const类型转换为非const类型,可以方便进行赋值。但是模板位置只能存放指针或者引用。

我们在创建a变量时使用了volatile关键字,目的是为了禁止编译器做出优化,导致输出的a值与实际的a值不相同的情况。 a是const int类型,本来是不可以进行改变的,但是最终通过const_cast的转换,最终进行了改变。

dynamic_cast

dynamic支持继承中,父类对象父类对象的地址传递给子类对象子类对象的指针子类对象的引用,也就是向下兼容。

class A
{

	virtual void func()
	{}
private:
	int _a;
};

class B :public A
{
private:
	int _b;
};


int main()
{
	//1.子类对象的指针可以传给父类对象的指针,向上兼容规则,天然支持
	A* a1=nullptr;
	B b1;
	a1 = &b1;

	//2.父类对象的指针可以传给子类对象的指针,使用dynamic_cast实现向下兼容
	A a2;
	B* b2 = nullptr;
	b2 = dynamic_cast<B*>(&a2);

	return 0;
}

再学习继承时,我们知道子类的对象和子类对象的地址是可以传递给父类的对象,父类对象的指针和父类对象的引用的,这是编译器天然支持的行为,但是相反父类是不能够传递给子类的,于是就有了dynamic_cast的类型转换,实现了向下兼容,但是前提是在父类中必须实现虚函数。

引用了dynamic_cast之后,虽然支持了父类向子类的向下兼容,但是实际上这种转换是没有什么太大的意义的,因为转换之后,子类的指针和引用或者单纯的子类对象都是是一个空值,进行不了任何的访问。 所以dynamic_cast一般情况下就适用于,继承中的子类对象向父类对象的转换。

为什么要引入四种类型转换?

  •  期望C++程序员不要使用C语言中的隐式和强制类型转换,这样可以防止在项目中被类型转换而导致项目中一些不易被排查出来的bug的产生。

以上便是C++中类型转换的所有内容。

本期内容到此结束,至此,C++的所有内容已经更新完毕^_^ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

以棠~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值