1 reerpret_cast(在编译期间实现转换)
reerpret_cast类型转换将个类型指针转换成另个类型指针这种转换不用于修改指针变量值数据存放格式(不改变指针变量值)只需在编译期间重新解释指针类型就可以做到
reerpret_cast可以将指针值转换为个整型数但是不能用于非指针类型转换否则将不会通过编译
什么时候使用reerpret_cast进行数据类型转换:
(1)将基本类型指针转换成另个类型指针
例如:
基本类型指针转换
double d = 9.3;
double *pd = &d;
*pi = reerpret_cast< *>(pd);//相当于隐式转换 * pi = ( *)pd;
(2)将个类指针转换为另个类指针
类指针类型转换:
A{};
B{};
A* pa = A;
B* = reerpret_ cast<B*>pa;
(3)不能转换非指针类型
例如:
将类型转换为float类型时是不能够转换成功
i = 8;
double dl = reerpret_cast<double>(i);
(4)不能将个const指针转换成void*类型指针
const * pci = 0;
void *pv = reerpret_cast<void*>(pci);
2 const_cast(在编译期间实现转换)
const_cast用于去除指针变量常量属性将它转换为个对应指针类型普通变量反过来也可以将个非常量指针变量转换为常量指针变量这种转换是在编译期间作出类型更改
(1)将常量指针变量转换为对应指针类型普通变量
const *pci = 0;
* pj = const_cast<*>(pci);//相当于隐式转换* pj = (*)pci;
(2)将普通指针变量转换为个常指针变量
* pi =0;
const * pcj = const_cast<const *>(pi);//相当于隐式转换const * = (*)pi
(3)将类常指针变量转换为类普通指针变量
const A* pca = A;
A* pa = const_cast<A*>(pca);//相当于隐式转换A* pa = (A*)pca;
(4)无法将非指针常变量转换为普通变量无法将非指针普通变量转换为常变量
i =0;
const cj = const_cast<const >(i);//非指针转换不能通过编译
(5)但可以通过隐式转换将非指针普通变量转换为常变量
i = 0;
const ck = (const )(i);
3 stactic_cast(在编译期间实现转换)
stactic_cast主要用于基本类型的间和具有继承关系类型的间转换这种转换般会改变变量内部表示方式因此_cast用于指针转换没有太大意义即使允许指针类型转换也不及reerprret转换效率高
(1)基本类型的间转换
i =0 ;
double d = _cast<double >;
(2)继承类型转换为基类
Base{};
Derived :public Base{};
Derived d;
Base b = _cast<Base>(d);
(3)继承类和基类指针进行转换编译能通过但是基类转换为继承类指针具有定危害性
Dereived* pd = Derived ;
Base *pb = _cast<Base*>(pd);
(4)不能使用_cast转换基本类型指针
* pi = 0;
double* pd = _cast<double>(pi);
(5)不能把基类转换为继承类或转换无继承关系类指针
4 dynamic_cast(在运行期间实现转换并可以返回转换成功和否标志)
最新评论