设为首页收藏本站
查看: 224|回复: 3

10.《剑指C++》之从C到C++(10)

[复制链接]
  • TA的每日心情
    擦汗
    昨天 08:01
  • 签到天数: 760 天

    [LV.10]以坛为家III

    发表于 2020-6-15 09:58:03 | 显示全部楼层 |阅读模式
    本帖最后由 御天行 于 2020-6-16 09:08 编辑

    ======《剑指C++系列》:总目录======

    本讲主要介绍:C++中的类型强换
    C++引入了新的强制转换类型。这套新类型的强制转换,可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换。C++提供了四种转化static_cast、reinterpret_cast、dynamic_cast和const_cast来满足不同需求,这种C++的强制转换风格带给我们的好处是,能够更清晰的表明它们要干什么。
    当然,C语言的转换风格,在C++中依然适用。

    1.static_cast
    语法格式:static_cast<type>(experssion)
    适用场景:在一个方向上可以作隐式转换,在另一个方向上就可以做静态转换。(当然,双向可隐式的不需要强制转换)
    //单向隐式:只能单方向转换
    1. void *p ;
    2.     int *q;
    3.    
    4.     p = q;
    5.     //q = p;//error 不能将void*赋值给其他类型指针!
    6.     q = static_cast<int *>(p);//使用static_cast强制转换
    复制代码
    //双向隐式
    1.     int a = 10;
    2.     float b = 5.5;

    3.     a = b;
    4.     b = a;
    5.     //对于双向可隐式,语法上添不添加强制转换均可
    6.     a = static_cast<int>(b);
    7.     b = static_cast<double>(a)+10;
    复制代码

    2.reinterpret_cast
    语法格式:reinterpret_cast<type>(experssion)
    适用场景:"通常为操作数的位模式提供较低层的重新解释",即将数据以二进制存在的形式的重新解释,在双方向上都不可以隐式类型转换的,则需要重解释类型转换。
    1. #include <iostream>
    2. using namespace std;

    3. int main(){

    4.     //两个均非void* 且类型不同的指针之间,不能通过隐式转换
    5.     int *p;
    6.     float *q;

    7.     //p = q;   //error
    8.     //q = p;   //error

    9.     //p = static_cast<>(int *)(q);    //也不能通过static_cast<>进行强制转换
    10.     //q = static_cast<>(float *)(p);

    11.     p = reinterpret_cast<int *>(q);
    12.     q = reinterpret_cast<float *>(p);

    13.     return 0;
    14. }
    复制代码

    3.const_cast
    语法格式:const_cast<type>(experssion)
    适用场景:用来移除非const对象的引用指针的常量性(此语法的操作对象只能是引用或指针),使用 const_cast 去除 const 对于引用和指针限定,通常是为了函数能够接受参数或返回值。
    此语法也可以作为const的补充,对指针或引用加上const限定之后,通过该语法亦可解除限定。
    1. #include <iostream>
    2. using namespace std;

    3. void fun(const int &a){
    4.     const_cast<int &>(a) = 200;
    5. }

    6. int main(){

    7.     int a;
    8.     //作用于引用
    9.     const int &ra = a;
    10.     a = 100;
    11.     cout<<a<<endl;
    12.     const_cast<int &>(ra) = 300;
    13.     cout<<ra<<endl;
    14.     cout<<a<<endl;
    15.    
    16.     //作用于指针
    17.     const int *p = &a;
    18.     *const_cast<int *>(p) = 400;
    19.     cout<<*p<<endl;
    20.    
    21.     //在函数内应用
    22.     fun(a);

    23.     return 0;
    24. }
    复制代码

    引申探究:const对象可以"脱"吗?
    实验1:const对象去const的研究
    1. #include <iostream>
    2. using namespace std;

    3. struct Stu{
    4.     int a;
    5. };

    6. int main(){

    7.     const int a = 100;
    8.     cout<<"a="<<a<<endl;
    9.     const int &ra = a;  //const对象只能使用const引用,此时不能通过引用ra改变a的值
    10.     //ra = 200;  //error

    11.     const_cast<int &>(ra) = 200;//尝试对其去const,再进行赋值,此时编译是通过的
    12.     cout<<"a="<<a<<endl;
    13.     cout<<"ra="<<ra<<endl;

    14.     //定义一个结构体d并初始化
    15.     const Stu d = {10};
    16.     cout<<"d.a="<<d.a<<endl;
    17.     const Stu &rd = d;  //通过const引用d
    18.     const_cast<Stu &>(rd).a = 20;  //去const化,并重新赋值
    19.     cout<<"d.a="<<d.a<<endl;
    20.     cout<<"rd.a="<<rd.a<<endl;

    21.     return 0;
    22. }
    复制代码

    运行结果:

    由运行结果可知:定义的普通变量a的值前后未发生改变,而结构体内的值前后发生了改变。是否可以认为,普通变量a的值未发生改变,是因为产生了中间变量,通过去const操作,引用改变的是这个中间变量的值,而在结构体中,数据发生了改变,是由于去const后,通过引用能改变结构体内的值呢?答案是否定的!
    实际上:原生数据是非 const 的,可以去除其引用的 const 的属性,若原生数据是 const 的,去除其引用的 const 属性,执行任何写入操作都是未定义的。
    4.dynamic_cast
    用于多态中的父子类之间的强制转化,这将在后面的相应部分进行讲解。
    上一篇:9.内联函数inline
    下一篇:11.命名空间

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?注册

    x

    评分

    1

    查看全部评分

  • TA的每日心情
    开心
    昨天 12:21
  • 签到天数: 1463 天

    [LV.10]以坛为家III

    发表于 2020-6-15 12:30:08 | 显示全部楼层
    感谢楼主分享,楼主辛苦了!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    4 天前
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2020-7-1 10:12:03 来自手机 | 显示全部楼层
    学习了 感谢楼主分享
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    站长推荐 上一条 /3 下一条

    红盟社区--中国红客联盟 

    Processed in 0.079004 second(s), 18 queries.

    站点统计| 举报| Archiver| 手机版| 黑屋 |   

    Powered by HUC © 2001-2017 Comsenz Inc.

    手机扫我进入移动触屏客户端

    关注我们可获取更多热点资讯

    Honor accompaniments. theme macfee

    快速回复 返回顶部 返回列表