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 想要表达的更为确切,方便管理。

参考文章

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
static<>是C++中的一个强制类型转换操作符。它可以用于进行简单粗暴的类型转换,但其正确性完全由程序员自己保证。与C语言中的强制转换不同,static_cast会在编译时进行类型检查。它可以明确告诉编译器转换的目的,也可以让其他程序员清楚地知道转换的意图。static_cast可以进行精度大转精度小的转换,使用位截断来处理。此外,它还可以用于基类与派生类指针或引用类型之间的转换,但它不会做运行时的检查,因此相比dynamic_cast来说不那么安全。相比之下,dynamic_cast会遍历整个类继承体系进行类型检查,所以在执行效率上比static_cast要差一些。总而言之,static_cast是一个强制类型转换操作符,可用于进行各种类型的转换。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [static_cast 剖析](https://blog.csdn.net/qq_45853229/article/details/124721212)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【C++】强制类型转换操作符 static_cast](https://blog.csdn.net/lemonxiaoxiao/article/details/121075537)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值