C++的类型转换

类型转换名称和语法

        C风格的强制类型转换(Type case)很简单,无论什么类型的转换统统  TYPE b = (TYPE)a

        C++风格的类型转换提供了4中方法:

static_cast            静态类型转换
reinterpreter_cast     重新解释类型(不安全,不推荐使用)
dynamic_cast           动态类型转换
const_cast             去const属性

四种类型转换的详情

static_cast 

静态类型转换,编译的时候 c++编译器会做类型检查。 基本类型能够转换,但是不能转换指针。可实现C++中内置基本数据类型之间的相互转换(int,struct,enum,char...)。不能进行无关类型指针之间的转换。【无关类型:非基类与派生类之间,也就是说可以进行基类与子类之间的类型转换,但是不建议使用,不安全。编译阶段进行的,它可以是基类转成子类,显然这样是不行的】

reinterpret_cast

与C风格相同,不考虑类型安全,不到万不得已不建议使用

重写解释类型,但没有进行二进制转换。转换类型必须是一个指针,应用、算数类型、函数指针、成员指针。在比特级别上进行转换。最普通的用途就是在函数指针类型之间进行转换,很难保证移植性。

dynamic_cast

动态类型转换,安全的基类和子类之间转换,运行时类型检查。使用时保证基类中有虚函数,否则编译不通过。类中存在虚函数,就说明它想让基类的指针或引用指向派生类。

const_cast

去除变量的只读属性。不能在不同种类间转换。仅仅作用于const,可以使本来不是const转成const,本来是const去除const。

向上转型:dynamic_cast与static_cast效果一样
向下转型:dynamic_cast比static_cast更加安全
(父类指针可以指向子类对象,因为类型兼容机制   子类指针不能指向父类对象)

程序案例

        C语言中,能隐式类型转换的在C++中可以用static_cast进行类型转换

        C语言中,不能隐式类型转换的在C++中可以用reinterpret_cast进行类型转换

C++的类型转换_第1张图片

要转型就必须先有继承。继承是面向对象语言中一个代码复用机制。简单说就是子类继承了父类中的非私有属性和可以继承的方法。然后子类可以继承扩展自己的属性和方法。 

向上转型:通过子类对象实例化父类对象,这种是自动转换(Father f = new Son)

向下转型:通过父类对象实例化子类对象,这种需要强制转换(Son s = (Son)f)

#include 
using namespace std;

class Animal
{
public:
    virtual void cry() = 0;
};

class Dog:public Animal
{
public:
    virtual void cry()
    {
        cout<<"wangwnag"<cry();
    
    //Dog *pDog = static_cast(base);  //向下转型

    Dog *pDog = dynamic_cast(base);

    if(pDog != nullptr)
    {   
        pDog->cry();
        pDog->doSwim();
    }

    Cat *pCat = dynamic_cast(base);  //向下转型
    if(pCat != nullptr)
    {
        pCat->cry();
        pCat->doTree();
    }


}

int main(void)
{
    Animal  *base = NULL;

    Cat *pCat;
    Dog *pDog = dynamic_cast(base);       //向下转型:
    base = dynamic_cast(pCat);         //向上转型
    base = pCat;        //向上转型 
    //pCat = base;        //err  向下转型需要强制转换

    //把base转换成其他 非动物相关的 err
    //Book *pbook = static_cast(base);

    Book *pbook = reinterpret_cast(base);

    //dynamic_cast用法
    ObjPlay(new Cat());     //这个传参的过程是一个向上转型


    return 0;
}

cosnt_cast实例

        如果需要去const属性进行修改,首先要保证这段内存能够被修改

C++的类型转换_第2张图片

 

你可能感兴趣的:(c++基础,c++,c语言)