类型强转



	int i = 0;
	double d = i; //显示的强制类型转换
	cout << i<<endl;

	int *p =&i;
	double b = (int)p;//显示的强制类型转换
	cout << b;

1 static_cast

int i = 2;
	double d = static_cast<double>(i); //正确,相关类型转换        
	int *p = &i;
	double d = static_cast<double>(p);//错误,不能转换,不想关类型 

            1 基本类型转化,如int-》flaot
     2 静态转化,子类转化父类指针

3相比于C语言的直接转换,static_cast具有编译时期的类型检查机制,

2   const_cast:删除变量const属性,

const int a = 0;
int *p = const_cast<int*>(&a);
*p = 2;
3 reinterpret_cast:一种类型转换为另一种不同的类型。代码是不可移植的,所以不建议使用
 指针,整数之间的互相转化
在指针类型(尤其是函数指针)之间进行转换
int *p;
char *pc = reinterpret_cast<char*>(p);
4 dynamic_cast :父类对象的指针转换为子类对象的指针或引用(动态
向上转型:子类对象指针->父类指针/引用(不需要转换)
向下转型:父类对象指针->子类指针 / 引用(用dynamic_cast转型是安全的)
 dynamic_cast只能用于含有虚函数的

Dynamic_cast运行时转化,运行时转换就需要知道类对象的继承关系-》通过虚函数表,

c++对象模型中,对象实例有虚函数指针,
子类会继承父类的虚函数表,通过虚函数指针可获取该对象的所有虚函数,包括父类
在转换时可以判断对象有无继承关系
所以虚函数对于正确的基类指针转换为子类指针是非常重要的。

BaseClass* pb2 = new BaseClass();

DerivedClass *pd21 = static_cast<DerivedClass *>(pb2);

//父类->子类,静态类型转换,危险!访问子类m_szName成员越界

DerivedClass *pd22 = dynamic_cast<DerivedClass *>(pb2);

//父类->子类,动态类型转换,安全的。结果是NULL
explicit:防止经过构造函数进行的隐式类型转换
对象构造函数前加explicit,
A a=1;// 错误,隐式转换-> A tmp(1); A a2(tmp);








猜你喜欢

转载自blog.csdn.net/qq_38936579/article/details/79182860