static_cast 剖析

Posted 敲代码的Messi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了static_cast 剖析相关的知识,希望对你有一定的参考价值。

前言

语法 :static_cast< 想要的类型> (原数据), 是C++中的关键字
-------在C++中,我们经常用到 隐式的类型 转换,比如 char->int , int ->double, 类层次结构中基类 和 派生类之间指针或引用的转换
-------编译器隐式执行的任何类型转换都可以由 static_cast显式完成
-------需要注意的是, 我们要 确保 目标数据类型 是 我们想要的类型,因为static_cast 不做 运行时的类型检查(RTTI,Run-time type identification)
------- 相当于 C 语言的强制类型转换,后面会讨论 其差别。
------ 不能更改数据 const , static 等属性。

1. 基本数据类型转换

    double d = 1.2;
    int i= static_cast<int> (d); // = C语言的 (int)d;
    cout << i << endl;


2. 类层次结构中基类和派生类 之间指针或引用的转换。

  1. 进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;
  2. 进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的因为可能派生类定义了 基类中 没有的成员变量。
class A

;
class B:public A

;
class C:public A

;
class D

;
A objA;
B objB;
A* pObjA = new A();
B* pObjB = new B();
C* pObjC = new C();
D* pObjD = new D();
 
objA = static_cast<A&>(objB);     //转换为基类引用    
objA = static_cast<A>(objB);
objB = static_cast<B>(objA);      //error 不能进行转换  
 
pObjA = pObjB;                    //right 基类指针指向子类对象
//objB = objA;                      //error 子类指针指向基类对象
pObjA = static_cast<A*>(pObjB);   //right 基类指针指向子类
pObjB = static_cast<B*>(pObjA);   //强制转换 OK 基类到子类
//pObjC = static_cast<C*>(pObjB);   //error 继承于统一类的派生指针之间转换 
//pObjD = static_cast<D*>(pObjC);   //error 两个无关联之间转换</span>

用法 总结

------static_cast常用来进行基本类型直接的转换,如char与int、int与float、enum与int之间;

-------static_cast也可以转换用户自定义类型,但目标类型必须含有相应的构造函数;

------static_cast还可以转换对象的指针类型,但它不进行运行时类型检查,所以是不安全的;

------static_cast甚至可以把任何表达式都转换成void类型;

------satic_cast不能移除变量的const属性,请参考const_cast操作符;

------static_cast进行的是简单粗暴的转换,所以其正确性完全由程序员自己保证。

static_cast 和 C 语言 强制转换的差别

  1. static_cast 会做 编译时的类型检查,而 强制转换不会。
    实例: 两个不相关的类:A,B
  2. static_cast 想要表达的更为确切,方便管理。

参考文章

以上是关于static_cast 剖析的主要内容,如果未能解决你的问题,请参考以下文章

为啥减法与static_cast溢出?

什么时候应该使用 static_cast、dynamic_cast、const_cast 和 reinterpret_cast?

什么时候应该使用 static_cast、dynamic_cast、const_cast 和 reinterpret_cast?

SQLite剖析之内核研究

opencv边缘检测的入门剖析

28Java并发性和多线程-剖析同步器