C++笔记-1(C++类型转换)

C的转换属于太多与灵活,如果C++的类与对象也这样使用,将会很不安全。

char* pstring = "hello!"
int* p =(int *)pstring;

一、static_cast静态类型转换

static_cast用于相关类型的指针之间的转换,还可以显式执行标准数据类型的类型转换。其重要的作用是在编译阶段检查类型转换是否安全。

	Base *pBase = new Base();
	Derived *pDerived = new Derived();
	
	pBase = pDerived;	//OK,直接向上转换没有问题
	
	pDerived = pBase;	//error,这就得强制转换了,用下面的方法
	pDerived = static_cast(pBase);		//OK,安全的强制转换

	Unrelated *p = static_cast(pBase);	//error,转换到不相关的类型这就报错了

下面 是VS报错信息

C++笔记-1(C++类型转换)_第1张图片

二、dynamic_cast和RTTI(运行阶段类型识别)

dynamic_cast动态类型转换。在运行阶段执行类型转换。这就与动态类型识别有关了。在C++11中常见,具体

注意一定要检查dynamic_cast的返回值的有效性,dynamic_cast的转换很容易失败,返回NULL转换失败。

三、reinterpret_cast

这就是一个强制转换,类似于C语言习惯。回到那个程序

Unrelated *p = static_cast(pBase);	//error,转换到不相关的类型这就报错了
但是这样就可以了

Unrelated *p = reinterpret_cast(pBase);	//OK,转换到不相关的类型不报错
官方建议我们不要一直用,因为不安全。

四、const_cast

这个更是逆天的强制转换,官方建议不到万不得已,千万不要用。这是个关闭const访问修饰符的强制转换。直接破坏const的常量性。




你可能感兴趣的:(C-C++)