52CPP类型转换-static-cast-创新互联

C风格的类型转换很容易理解:

创新互联主营贡井网站建设的网络公司,主营网站建设方案,成都app开发,贡井h5微信小程序搭建,贡井网站营销推广欢迎贡井等地区企业咨询

语法:(目标类型)表达式 或 目标类型(表达式);

C++认为C风格的类型转换过于松散,可能会带来隐患,不够安全。

C++推出了新的类型转换来替代C风格的类型转换,采用更严格的语法检查,降低使用风险。

C++新增了四个关键字 static_cast、const_cast、reinterpret_cast和dynamic_cast,用于支持C++风格的类型转换

C++的类型转换只是语法上的解释,本质上与C风格的类型转换没什么不同,C语言做不到的事情的C++也做不到

语法:

static_cast(表达式);

const_cast(表达式);

reinterpret_cast(表达式);

dynamic_cast(表达式); //重新解释

实际开发中用的最多(97%)的是static_cast,其它几种很少用

static_cast

#includeusing namespace std;
void func(void *ptr)
{
    double *pp = static_cast(ptr);
    //其它代码
}
//内置数据类型转换
void test()
{
    int ii = 3;
    long ll = ii; //绝对安全,可以隐式转换,不会出现警告

    double dd = 1.234;
    long ll1 = dd;                    //可以隐式转换,但是,会出现可能丢失数据的警告
    long ll2 = (long)dd;              // long(dd)  C风格:显示转换,不会出现警告
    long ll3 = static_cast(dd); // C++风格:显示转换,不会出现警告
}
//指针转换
void test2()
{
    int ii = 10;

    // double *pd1 = ⅈ//错误,不能隐私转换
    double *pd2 = (double *)ⅈ // C风格,强制转换
    // double *pd3 = static_cast(&ii); //错误,static_cast不支持不同烈性指针的转换

    void *pv = ⅈ                          //任何类型的指针都可以隐私转换成void*
    double *pd4 = static_cast(pv); // static_cast可以把void*转换成其它类型的指针
}
int main()
{
    test();
    test2();
    return 0;
}

为什么要转换指针呢? 一般是为了调用函数,指针用于传递参数,如果调用的函数需要转换指针,可以把它的形参设计为void* 类型,调用的时候,把其它类型的指针作为实参传进去,在函数里面再把void*指针转换成其它类型的指针。

也就是说转换指针的场景是:

其它类型的指针->void*指针->其它类型指针

reinterpret_cast

只为转换指针的场景而设计

上面几种应用场景在多线程、函数回调和网络编程中经常用到。

const_cast

static_cast不能丢掉指针(引用)的const和volitale属性,const_cast可以。

C++中volitale关键字没什么用,java中的volitale关键字有用的,这里就不见volitale了,有兴趣再百度把。

#includeusing namespace std;
void func(void *ptr)
{
    double *pp = static_cast(ptr);
    //其它代码
}
//内置数据类型转换
void test()
{
    int ii = 3;
    long ll = ii; //绝对安全,可以隐式转换,不会出现警告

    double dd = 1.234;
    long ll1 = dd;                    //可以隐式转换,但是,会出现可能丢失数据的警告
    long ll2 = (long)dd;              // long(dd)  C风格:显示转换,不会出现警告
    long ll3 = static_cast(dd); // C++风格:显示转换,不会出现警告
}
//指针转换
void test2()
{
    int ii = 10;

    // double *pd1 = ⅈ//错误,不能隐私转换
    double *pd2 = (double *)ⅈ // C风格,强制转换
    // double *pd3 = static_cast(&ii); //错误,static_cast不支持不同烈性指针的转换

    void *pv = ⅈ                          //任何类型的指针都可以隐私转换成void*
    double *pd4 = static_cast(pv); // static_cast可以把void*转换成其它类型的指针
}
void func2(void *ptr)
{
    // int i = reinterpret_cast(ptr);
    // cout<< i<< endl;
}
// reinterpret_cast
// VS里面可以,但是有警告 警告的原因是int和void*占用的内存空间不一样
void test3()
{
    int ii = 10;
    double *pd3 = reinterpret_cast(&ii);

    func2(reinterpret_cast(ii));
}

// long long 和void* 都占8字节
void func3(void *ptr)
{
    long long i = reinterpret_cast(ptr);
    cout<< i<< endl;
}

void test4()
{
    long long ii = 10;
    func3(reinterpret_cast(ii));
}
// const_cast
void func4(int *i) {}
void test5()
{
    const int *a = nullptr;
    int *b = (int *)a;             // C风格,强制转换,丢掉const限定符
    int *c = const_cast(a); // C++风格,强制转换,丢掉const限定符

    func4(const_cast(a));
}
int main()
{
    test();
    test2();
    // test3();
    test4();
    test5();
    return 0;
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享名称:52CPP类型转换-static-cast-创新互联
浏览路径:http://ybzwz.com/article/cohcpd.html