C++强制类型转换

1、C++中有哪些类型转换

(1)static_cast:类似于C风格的强制转换。无条件转换,静态类型转换。主要用于

a.转换继承类的对象为基类对象

b.基本数据类型转换。enum, struct, int, char, float等。

c.把空指针转换成目标类型的空指针。

d.把任何类型的表达式转换成void类型。

因为这种转换一般会更改变量的内部表达方式,所以应用于指针类型转换没有太大意义。

例子:

//基本类型转换 
int i=0; 
double d = static_cast<double>(i); //相当于 double d = (double)i; 
//转换继承类的对象为基类对象 
class Base{}; 
class Derived : public Base{}; 
Derived d; 
Base b = static_cast<Base>(d); //相当于 Base b = (Base)d; 

(2)const_cast:去掉指针类型的const或volatile属性。出于安全性考虑,const_cast无法将非指针的常量转换为普通变量

struct SA {

int i;

};

const SA ra;

//ra.i = 10; //直接修改const类型,编译错误

SA &rb = const_castSA&>(ra);

rb.i = 10;

3)dynamic_cast:有条件转换,动态类型转换,运行时类型安全检查(转换失败返回NULL):该函数只能在继承类对象的指针之间或引用之间进行类型转换。

1. 安全的基类和子类之间转换。

2. 必须要有虚函数。

3. 相同基类不同子类之间的交叉转换。但结果是NULL。

例: 
class Base{}; 
class Derived : public Base{}; 

//派生类指针转换为基类指针 
Derived *pd = new Derived; 
Base *pb = dynamic_cast<Base*>(pd); 

if (!pb) 
cout << "类型转换失败" << endl; 

//没有继承关系,但被转换类有虚函数 
class A(virtual ~A();) //有虚函数 
class B{}: 
A* pa = new A; 
B* pb = dynamic_cast<B*>(pa); 

(4)reinterpret_cast:该函数将一个类型的指针转换为另一个类型的指针. 
这种转换不改变指针变量值,只需在编译时重新解释指针的类型就可做到,可以将指针值转换为一个整型数,但不能用于非指针类型的转换.


//基本类型指针的类型转换 
double d=9.2; 
double* pd = &d; 
int *pi = reinterpret_cast<int*>(pd); //相当于int *pi = (int*)pd; 

//不相关的类的指针的类型转换 
class A{}; 
class B{}; 
A* pa = new A; 
B* pb = reinterpret_cast<B*>(pa); //相当于B* pb = (B*)pa; 

//指针转换为整数 
long l = reinterpret_cast<long>(pi); //相当于long l = (long)pi; 

2、为什么要用static_cast转换而不用c语言中的转换?

C语言中的强制类型转换,编译是不会报错的,这就留下了隐患,而static_cast在编译时进行了类型检查,直接报错,因此比较安全。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值