C++中的类型转换

C++是强类型语言,不推荐进行类型转换。在C++看来,类型转换就是因为设计不好。但是,有些情况类型转换也是不可避免的。一下介绍介绍C++的类型转换,以备以后查阅:

C++类型转换涉及到四个函数,他们都是通过模板来实现的,分别是static_cast、 dynamic_cast、 const_cast、 reinterpret_cast。

static_cast  为一般类型转换函数,可以转换内嵌数据类型,指针、引用,具有继承关系的类指针或引用

dynamic_cast 通常在基类和派生类之间转换(指针或引用),转换之前会进行类型检查,而且会进行安全检查,一般只能进行子类到父类的转换,不能将父类转换为子类。

const_cast  用于脱const或加const,转换的值必须是指针

referinter_cast  称为重定向,它能重新定义内存空间,因此几乎是不受限制的进行转换。

以下用一些例子进行说明:

#include 
using namespace std;

/*
	static_cast 
	一般转换,内嵌数据,指针和引用,具有继承关系的类指针或引用
	dynamic_cast   
	通常在基类和派生类之间转换(指针或引用),转换之前会进行类型检查,而且进行安全检查
	一般可以进行子类转父类,不能父类转子类
	const_cast  针对const转换
	referinter_cast  重定义,不需要有任何关联性
*/

class Animal {};
class Cat :public Animal {};
class Build {};

typedef void(*func1)();
typedef int(*func2)();

int main(void)
{

	int a = 10;
	int* pa = &a;
	int& ra = a;

	Animal ani;
	Animal* pAni;
	Animal& rAni = ani;
	
	Cat cat;
	Cat* pCat;
	Cat& rCat = cat;

	Build bui;
	Build* pBui;
	Build& rBui = bui;

	func2 *f2;
	func1* f1;

	double da = static_cast(a);  //基本类型的强制转换
	double* pda = static_cast(pa); //错误,不能将指向int类型的指针转换为指向double类型的指针
	Cat tani = static_cast(ani);   //错误,转换需要拷贝构造函数
	Cat* tpAni = static_cast(pAni);  //通过指针可以进行转换,父类到子类的转换
	Animal* tc = static_cast(pCat);  //子类到父类的转换
	func1* tf1 = static_cast(f2);  //错误,不能进行不相关的转换, reinterpret_cast可以
	func1* tf2 = reinterpret_cast(f2); //正确,给一块内存重新定义

	double dda = dynamic_cast(a);  //错误,不能进行基本数据类型的转换
	Animal ttan = dynamic_cast(cat);  //错误,只能转换指针和引用
	Animal* ttan2 = dynamic_cast(pCat);  //正确, 子类向父类转换
	Cat* ttcat = dynamic_cast(pAni); //错误, 不能父类向子类转换, 这种转换是不安全的
	//dynamic_cast检查很严格,只能进行子类向父类转换,而且只能通过指针和引用

	const int cint = 10;
	const int* pcint = &cint;
	int* cc = const_cast(pcint);   //脱const
	const int* pcc = const_cast(cc); //加const
	const int& rci = cint;
	int& ri = const_cast(rci);  //脱const
	const int& trc = const_cast(ri); //加const
	//const_cast用于脱const和加const,只能用于指针和引用

	int ta = 10;
	int* p = reinterpret_cast(ta); //reinterpret_cast属于无下限转换,只要是空间大小相同,不管什么类型都可以相互转换,称为重定向
									     //是对内存块的重新定义。

}

 

你可能感兴趣的:(c/c++)