写点什么

C++ 中的显式类型转换操作符总结

作者:老王同学
  • 2023-02-27
    广东
  • 本文字数:771 字

    阅读完需:约 3 分钟

  即使类型转换本身是危险的,在有些时候类型转换也是不可或缺的。程序员不使用显式转换,编译器也可能会使用隐式转换,那还不如把代码控制在程序员自己手中。

    C++有 4 种显式类型转换操作符,最好不要使用 C 语言编程方式遗留的隐式类型转换。

第一,显式类型转换在代码中更明显,可以提醒程序员你的代码设计可能存在一些丑陋的地方;

第二,显式类型转换可以检测转换中的错误,比如当 cast 失败时,你会得到空指针,但隐式转换就不会;

第三,有些情况,隐式类型转换无法做到,比如 const_cast 的功能。


static_cast

编译器隐式执行的任何类型转换,都可以使用 static_cast 显式完成。一般用于不同大小的类型之间互相转换。


doubled = 97.0;charch = static_cast<char>(d);
复制代码


const_cast

顾名思义,用于转换掉表达式的 const 性质。

比如我们从外部接受了一个 const 类型的参数,再传递给下层函数时,又需要修改它 const_cast 就派上用场了。


constchar* pc_str;char*pc = string_copy(const_cast<char*>(pc_str));
复制代码


dynamic_cast


将基类类型的指针或引用安全地转换为派生类型的指针或引用。如果转换到指针类型的 dynamic_cast 失败,则其结果为 0 值;如果转换到引用类型的 dynamic_cast 失败,则抛出一个 bad_cast 类型的异常。这也是为什么不使用 C 方式类型转换的原因,C 方式的转换失败后,我们不知道如何检测错误。


Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
复制代码


reinterpret_cast


为操作数的位模式提供较低层次的重新解释。啥意思呢。假设有一堆数据,保存的是一个 int 类型的序列,本来应该使用 int*对其进行遍历,但有时候我们可能需要逐个字节的进行访问,以进行一些特殊操作。那么就可以使用此转换操作符。但我们应当有清醒的意识,其实指针指向的类型一直都是 int。


int* ip;char* pc = reinterpret_cast<char*>(ip);
复制代码


上述内容大部分摘自《C++Primer》一书。

发布于: 刚刚阅读数: 2
用户头像

老王同学

关注

还未添加个人签名 2020-04-30 加入

还未添加个人简介

评论

发布
暂无评论
C++中的显式类型转换操作符总结_c++_老王同学_InfoQ写作社区