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. 类层次结构中基类和派生类 之间指针或引用的转换。
- 进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;
- 进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。因为可能派生类定义了 基类中 没有的成员变量。
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 语言 强制转换的差别
- static_cast 会做 编译时的类型检查,而 强制转换不会。
实例: 两个不相关的类:A,B
- static_cast 想要表达的更为确切,方便管理。
以上是关于static_cast 剖析的主要内容,如果未能解决你的问题,请参考以下文章
什么时候应该使用 static_cast、dynamic_cast、const_cast 和 reinterpret_cast?
什么时候应该使用 static_cast、dynamic_cast、const_cast 和 reinterpret_cast?