c++四种类型转换

c++有四种类型转换的方式

const_cast

用于去掉const,volatile和_unaligned属性

说到了const 在这里提一下

const
简单理解:const的目的就是定义一个“不会被修改的常量”,可以修饰变量,指针,引用,函数参数等等
使用const可以减少代码出错的概率,

int main() {
	struct T {
		int i= -1;
	};
	const T a;

	//a.i = 100;
	T& b = const_cast<T&>(a);
	b.i = 100;

	cout << a.i << endl;

	return 0;
}

我们把上述代码放入编译器内 会发现 **a.i=100;**这句报错
因为const关键字的缘故
在这里插入图片描述

但是通过const_cast关键字就可以使其赋值
然后我们看下结果
在这里插入图片描述

static_cast

static_cast类似于C语言中的强制转换 进行无条件转换,静态类型转换

1.基类和子类之间的转换,子类指针转换为父类指针是安全的,但是父类指针转换为子类指针是不安全的

2.static_cast可以转换基本数据类型如:int char float enum struct 不能转换无关类型比如非基类和子类的转换

3.把任何类型的表达式转换成void类型

4.static_cast 不能去掉类型的const volatile类型(用const_cast)

static_cast不提供运行时检查 所以在编写的时候要确认安全性


int main() {
	int n = 100;
	double t = static_cast<double>(n);
	char t = static_cast<char>(n);
	//基本类型转换

	int* pn = &n;
	//无关转换类型转换错误
	double& t = static_cast<double*>(&n);
	//转换正确
	void* p = static_cast<void*>(&n);
}

dynamic_cast

相比static_cast来说,dynamic_cast在转换之前会检测类型转换是否合法,具有一定安全性 同时额外消耗一些性能
有条件的转换,动态类型的转换,运行的时候检查类型安全(转换失败返回NULL)
1.安全的基类和子类之间的转换

2.必须带有虚函数

3.相同基类,不同子类之间的交叉转换,但是结果必须返回NULL

class Base {
public:
	int i;
	virtual void foot() {};//虚函数时必须的 保证多态特性才能使用
};
class sub :public Base {
public:
	char* name[100];
	void bar() {};
};
int main() {
	Base* pb = new sub();
	sub* ps1 = static_cast<sub*>(pb);//子类->父类 用static_cast将Base*转换成为sub*
	sub* ps2 = dynamic_cast<sub*>(pb);//动态转换 

	Base* pb2 = new Base();
	sub* ps3 = static_cast<sub*>(pb2);//虽然没有报错 但是比较危险 访问子类name成员越界
	sub* ps4 = dynamic_cast<sub*>(pb2);//动态类型转换

	return 0;

}

注意上边定义了一个虚函数,只有存在虚函数才能保证多态性

reinterpret_cast

仅仅重新解释类型,但没有进行二进制的转换

1.转换的类型必须是一个指针,引用,算术类型,函数指针或者是成员指针

2.在比特级上的转换,可以把一个指针转换成一个正数,也可以把一个整数转换成一个指针

3.最普通的用途就是函数指针类型之间进行转换

4.很难保证移植性

他可以转换任何内置的数据类型为其他任何的数据类型
也可以转化任何指针类型为其他类型,甚至可以转换内置数据类型为指针

非常激进的类型转换,在编译期完成,可以转换任何类型的指针,极不安全,非极端情况不要使用

总结

去const属性用const_cast
基本类型转换用static_cast
多态类之间类型转换用dynamic_cast
不同类型的指针类型转换用 reinterpret_cast

希望我所写的对大家有帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值