类型转换的四个关键字

一、static_cast

格式static_cast < type-id > ( expression )

功能:将表达式expression转换成最终想要的类型type-id类型,由于是非多态的转换,即运行时没有动态的类型检查,所以转换不能保证安全性。《C++Perimer》指明编译器隐式执行的任何类型转化都能通过static_cast 显示完成。因而,static_cast支持两种类型相关的转换。

用途

(1)基本数据类型的转换,如把int转换为char

(2)基类与派生类的指针或引用的转换:

                      向上转换:派生类的指针或引用转换成基类,安全

                      向下转换:基类的指针或引用转换成派生类,不安全

(3)空指针转换成目标类型的空指针

(4)任何类型的表达式转换成void类型。

注意

(1)static_cast不能转换掉expression的const、volatile、或者__unaligned属性;

(2)static_cast在编译期转换。

实例

int i;
float f = 10.5;
i = static_cast<int>(f);
cout<<i<<endl;//i=10

二、reinterpret_cast

格式reinterpret_cast<type-id> (expression)

功能:type-id必须是指针,引用,算术类型,函数指针或成员指针。reinterpret_cast可以将整数转换成指针,也可以将指针转换成整数,与static_cast相反的是,它支持不相关的类型转换。

用途

(1)从指针类型转换到一个足够大的整数类型;

(2)从整数类型或枚举类型转换到指针类型;

(3)从一个指向函数的指针转换成另一个指向不同函数的指针;

(4)从一个指向对象的指针转换成另一个指向不同对象的指针;

(5)从类函数成员指针转换成另一个指向不同的类函数成员指针。

(6)任意指针之间的转换。

实例

char *ss = "1234";  
int i = reinterpret_cast<int>(ss);  
cout << i << endl;  //875770417


三、const_cast

格式const_cast<type_id> (expression)

功能:用于修改const或volatile特性。

用途

(1)常量指针转换成非常量指针,并且依旧指向原来位置

(2)常量引用转换成非常量引用,并且依旧指向原来位置

实例

const char* p = "Hello World";
char *q = const_cast<char*>(p);

四、dynamic_cast

格式:dynamic_cast<type_id> (expression)

功能:将基类对象的指针或引用转换成继承类对象的指针或引用,因为dynamic_cast是在运行时确定类型的,所以其是安全的转换。比如,基类指针或引用确实指向派生类的对象,经过转换后可得到正确的指针,如果没有,将会得到空指针。将类层次向上转换时与static_cast相同,但当向下转换时,dynamic_cast具有安全检查,比static_cast更安全。

注意:由于是多态类型转换,所以基类必须具有至少一个虚函数。

实例

class Base
{
public:
	virtual int test(){return 0;} 
};
class Derived:public Base
{
public:
	virtual int test(){return 1;}
};
int main()
{
	Base base;
	Derived derived;
	Base *pB1=new Base;
	Base *pB2=new Derived;
	Derived* pD1=dynamic_cast<Derived*>(p1);//p1没有真正指向派生类,pD1置为0
	Derived* pD2=dynamic_cast<Derived*>(p2); //正确
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值