C++的类型转换运算符:static_cast

C++的类型转换运算符:static_cast

static_cast 用于在相关类型的指针之间进行转换,还可显式地执行标准数据类型的类型转换—这种转换原本将自动或隐式地进行。用于指针时, static_cast 实现了基本的编译阶段检查,确保指针被转换为相关类型。这改进了 C 风格类型转换,在 C 语言中,可将指向一个对象的指针转换为完全不相关的类型, 而编译器不会报错。 使用 static_cast 可将指针向上转换为基类类型, 也可向下转换为派生类型,如下面的示例代码所示:

Base* objBase = new Derived ();
Derived* objDer = static_cast<Derived*>(objBase); // ok!  
// class Unrelated is not related to Base
Unrelated* notRelated = static_cast<Unrelated*>(objBase); // Error
// The cast is not permitted as types are unrelated
将 Derived*转换为 Base*被称为向上转换,无需使用任何显式类型转换运算符就能进行
这种转换:
    
Derived objDerived;
Base* objBase = &objDerived; // ok!

将 Base*转换为 Derived*被称为向下转换,如果不使用显式类型转换运算符,就无法进
行这种转换:
    
Derived objDerived;
Base* objBase = &objDerived; // Upcast -> ok!
Derived* objDer = objBase; // Error: Downcast needs
explicit cast

然而, static_cast 只验证指针类型是否相关,而不会执行任何运行阶段检查。因此,程序员可使用 static_cast 编写如下代码,而编译器不会报错:

Base* objBase = new Base();
Derived* objDer = static_cast<Derived*>(objBase); // Still no errors!

其中 objDer 实际上指向一个不完整的 Derived 对象,因为它指向的对象实际上是 Base() 类型。由于 static_cast 只在编译阶段检查转换类型是否相关,而不执行运行阶段检查,因此 objDer -> DerivedFunction() 能够通过编译,但在运行阶段可能导致意外结果。

除用于向上转换和向下转换外, static_cast 还可在很多情况下将隐式类型转换为显式类型,以引起程序员或代码阅读者的注意:

double Pi = 3.14159265;
int num = static_cast<int>(Pi); // Making an otherwise implicit cast, explicit

在上述代码中,使用 num = Pi 将获得同样的效果,但使用 static_cast 可让代码阅读者注意到这里使用了类型转换,并指出(对知道 static_cast 的人而言)编译器根据编译阶段可用的信息进行了必要的调整, 以便执行所需的类型转换。 对于使用关键字 explicit 声明的转换运算符和构造函数, 要使用它们,也必须通过 static_cast。

该文章会更新,欢迎大家批评指正。

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:
服务器课程:C++服务器

你可能感兴趣的:(CC++编程要点,c++)