C++语言中的类型转换(静态,动态,常量)

概述:
类型转换(cast)是将一种数据类型转换成另一种数据类型。例如,如果将一个整型 值赋给一个浮点类型的变量,编译器会暗地里将其转换成浮点类型。 转换是非常 有用的,但是它也会带来一些问题,比如在转换指针时,我们很可能将其转换成一 个比它更大的类型,但这可能会破坏其他的数据。 应该小心类型转换,因为转换 也就相当于对编译器说:忘记类型检查,把它看做其他的类型。
无论什么原因,任何一个程序如果使用很多类型转换都值得怀疑. 标准 c++提供了一个显示的转换的语法,来替代旧的 C 风格的类型转换。 使用 C 风格的强制转换可以把想要的任何东西转换成我们需要的类型。那为什么还需要一 个新的 C++类型的强制转换呢? 新类型的强制转换可以提供更好的控制强制转换 过程,允许控制各种不同种类的强制转换。C++风格的强制转换其他的好处是,它 们能更清晰的表明它们要干什么。
静态转换:

#include <iostream>
#include <string>

using namespace std;

class A
{
public:
	int a;
};

class B
{
public:
	int b;
};

class C :public A
{
public:
	int c;
};
void test01()
{
	//static_cast 用来转化内置的数据类型,和C语言强转一样
	int a = 1;
	char b = 34;
	double c = 245.34;
	a = static_cast<int>(b);
	a = static_cast<int>(c);
}
void test02()
{
	A* p1 = new A;
	B* p2 = new B;
	C* p3 = new C;
	//p1 = static_cast<A*>(p2);//不能转化没有发生继承关系的类
	/*如果两个类之间发生了继承关系,可以类型转换,但是sattic_cast并不会保证安全性*/
	p1 = static_cast<A*>(p3);//子转父是安全的,向上转化
	//p3 = static_cast<A*>(p1);//父转子是向下转换是不安全的

	delete p1;
	delete p2;
	delete p3;
}

void test03()
{
	char* b = NULL;
	int* a = NULL;
	//a = static_cast<char*>(b);

}
int main()
{
	test01();
	return 0;
}

注意:
静态转换中static_cast并不会保证安全性,对于普通变量是使用的时候像C语言的强制转换一样,但是static_cast不能转换普通变量的指针test03,如果是自定义变量的话,只有发生继承关系的类才能相互转换,并且只能向上转换,子对象指针转向父对象指针,因为不会发生指针指向的内存空间越界(大转小),不能父对象转子对象。
动态转化:
1,不能用于转换基本的数据类型
2,可以用于转换发生继承关系的类,保证转换是安全的
3,如果发生了多态,子转父和父转子总是安全的(虚函数表是动态绑定的,不会发生越界)

class A
{
public:

	int a;
};

class B
{
public:
	int b;
};

class C :public A
{
public:
	int c;
};
//动态转换 dynamic_cast
void test04()
{
	//动态转换不能转内置的基本数据类型
	int a = 1;
	char b = 2;
	// a = dynamic_cast<int>(b);
}

void test05()
{
	A* p1 = new A;
	B* p2 = new B;
	C* p3 = new C;
	//子类转成父类
	//不能用于发生继承关系之间的类
	p1 = dynamic_cast<A*>(p3);
	//父类转成子类是不安全的
	//p3 = dynamic_cast<A*>(p1);
	delete p1;
	delete p2;
	delete p3;
}

注:dynamic_cast转化只能转换发生继承关系的自定义数据类型,不能用来转内置类型(int ,char)等,并且转换时如果发生了父转子,就会报错,所以保证了安全性
常量转换:
该运算符用来修改类型的 const 属性。。 常量指针被转化成非常量指针,并且仍 然指向原来的对象; 常量引用被转换成非常量引用,并且仍然指向原来的对象;
注意:不能直接对非指针和非引用的变量使用 const_cast 操作符去直接移除它的 const.


void test06()
{
	int* p1 = NULL;
	const int* p2 = NULL;
	
	//const不是基本的数据类型
	p1 = const_cast<int*>(p2);
	p2 = const_cast<const int*>(p1);//用来加const和去const

}

注意:const_cast就是加const和去const但是只能地址状态操作。
重新解释转换

void test07()
{
	int* p = NULL;
	char* p2 = NULL;
	p = reinterpret_cast<int*>(p2);
	p2 = reinterpret_cast<int*>(p);

	int c = 0;
	c = reinterpret_cast<int>(p2);
}

注意:一般用来转换指针,整数等基本类型和指针之间也可以转换。
总结:
static_cast一般用来转换基本的数据类型;
dynamic_cast一般用来转换发生继承关系的自定义类型
const_cast 一般同来加const和去除const(地址访问的时候:引用和指针)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值