类型转换的四个关键字

    xiaoxiao2021-03-25  122

    一、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; }

    转载请注明原文地址: https://ju.6miu.com/read-12731.html

    最新回复(0)