C++四种类型转换

#include
using namespace std;
//c++类型转换
//static_cast,dynamic_cast,reinterpret_cast,const_cast

static_cast

// static_cast用于内置数据类型间的转换
//static_cast无法进行不同指针类型的转换

reinterpret_cast

//1)reinterpret cast 的第一种用途是改变指针(引用)的类型。
// 2) reinterpret cast的第二种用途是将指针(引用)转换成整型变量。
//整型与指针占用的字节数必须一致,否则会出现警告,转换可能损失精度。
//3)reinterpret cast的第三种用途是将一个整型变量转换成指针(引用)

const_cast

//const_cast  把const属性去除/添加

dynamic_cast

//dynamic_cast 
// dynamic cast 运算符用指向基类的指针来生成派生类的指针,它不能回答“指针指向的是什么类的对象”的问题,但能回答“是否可以安全的将对象的地址赋给特定类型的指针”的问题。“
// 1) dynamic cast 只适用于包含虚函数的类。
//2)dynamic cast 可以将派生类指针转换为基类指针,这种画添足的做法没有意义。“
//3)dynamic cast 可以用于引用,但是,没有与空指针对应的引用值,如果转换请求不正确,会出现 bad cast异常。“
class A {
public:
    virtual void a2() {
        cout << "a的虚函数\n";
    }
};
class B :public A {
public:

    void a2() override {
        cout << "b的虚函数\n";
    }
    void Do1() {
        cout << "是b类型\n";
    }
};
class C :public A {
public:
    void a2() override {
        cout << "c的虚函数\n";
    }
};

auto staticcast(void* ptr) {
    double* a = static_cast (ptr);
    return a;
}
void reintercast(void* ptr) {
    int a = reinterpret_cast (ptr);//把指针类型转换为整型
    cout << "a:" << a << endl;
}
void constcast(int* ii) {

}
int main()
{
#pragma region static_cast
    int a = 1;
    double d = 1.2;
    int i = (int)d;//c风格的显示转换
    int j = int(d);//c风格的显示转换
    int k = static_cast(d);//C++的显示转换
    int* qq = (int*)&d;//c风格的强转
    double* ww = (double*)&a;//c风格的强转

    int b = 3;
    //double* www = static_cast(&b);//static_cast无法直接进行不同指针类型的转换,只能先转换为void*再转换(相当于中转站)
    void* ptr = &b;//任何类型的指针都可以隐式转换为void*
    staticcast(ptr);

#pragma endregion


#pragma region reinterpret_cast
    int abc = 10;
    reintercast(reinterpret_cast(abc));//整型变量转换成指针

    //    double* wwww = reinterpret_cast(&a);//不安全,因为reinterpret_cast会跳过编译器的类型检查,导致出现未定义的后果


#pragma endregion


#pragma region const_cast
    const int* xq = nullptr;
    int* xw = (int*)xq;//c风格强转
    int* xe = const_cast(xq);//去除了const

    int* az = nullptr;
    const int* ax = const_cast(az);//获得了const

    const int* l = nullptr;

    constcast(const_cast(l));//去除const传入函数
#pragma endregion


#pragma region  dynameic_cast
    A* a4 = new B();
    A* c4 = new C();
    
    
    if (c4 == dynamic_cast(a4))//不相等,类型不同
    {
        B* bb = dynamic_cast(a4);
        bb->Do1();
    }
    B* df = dynamic_cast(a4);//检查a4是不是B类,如果不是,df为空指针
    if (df!=nullptr)
    {
        df->Do1();
    }

#pragma endregion

    return 0;
}

你可能感兴趣的:(c++)