【C++深度剖析学习总结】 11 C++中的类型转换

举报
CodeAllen 发表于 2021/10/30 00:20:01 2021/10/30
【摘要】 【C++深度剖析学习总结】 11 C++中的类型转换 作者 CodeAllen ,转载请注明出处 1.强制类型转换 C方式的强制类型转换 (Type)(Expression) Type ...

【C++深度剖析学习总结】 11 C++中的类型转换

作者 CodeAllen ,转载请注明出处


1.强制类型转换
C方式的强制类型转换
(Type)(Expression)
Type (Expression)—老式类型

在这里插入图片描述

11-1 C语言粗暴的类型转换

#include <stdio.h>
typedef void(PF)(int);
struct Point
{
    int x;
    int y;
};
int main()
{
    int v = 0x12345;
    PF* pf = (PF*)v;
    char c = char(v);
    Point* p = (Point*)v;
   
    pf(5);
   
    printf("p->x = %d\n", p->x);
    printf("p->y = %d\n", p->y);
    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

运行结果:
段错误

在这里插入图片描述

C方式强制类型转换存在的问题
过于粗暴:任意类型之间都可以进行转换,编译器很难判断其正确性
难于定位:在源码中无法快速定位所有使用轻质类型转换的语句

问题:强制类型转换在实际工程中是很难完全避免的!如何进行更加安全可靠的转换
优化C的方法;新式类型转换

2.新式类型转换
C++将强制类型转换分为4种不同的类型
强制类型转换(牢记场合)
static_cast
const_cast
dynamic_cast
reinterpret_cast

用法:xxx_cast(Expression)
static_cast强制类型转换

用于基本类型间的转换
不能用于基本类型指针间的转换
用于有继承关系类对象之间的转换和类指针之间的转换

const_cast强制类型转换
用于去除变量的只读属性
强制转换的目标类型必须是指针或引用

reinterpret_cast强制类型转换(重解释)
用于指针类型间的强制转换
用于整数和指针类型间的强制转换

dynamic_cast强制类型转换(用于类指针)
用于有继承关系的类指针间的转换
用于有交叉关系的类指针间的转换
具有类型检查的功能
需要虚函数的支持

11-2 新式类型转化初探

#include <stdio.h>
void static_cast_demo()
{
    int i = 0x12345;
    char c = 'c';
    int* pi = &i;
    char* pc = &c;
   
    c = static_cast<char>(i);
   // pc = static_cast<char*>(pi);  //Error
}
void const_cast_demo()
{
    const int& j = 1;
    int& k = const_cast<int&>(j);
   
    const int x = 2;
    int& y = const_cast<int&>(x);
   
   // int z = const_cast<int>(x); //Error
   
    k = 5;
   
    printf("k = %d\n", k);
    printf("j = %d\n", j);
   
    y = 8;
   
    printf("x = %d\n", x);
    printf("y = %d\n", y);
    printf("&x = %p\n", &x);
    printf("&y = %p\n", &y);
}
void reinterpret_cast_demo()
{
    int i = 0;
    char c = 'c';
    int* pi = &i;
    char* pc = &c;
   
    pc = reinterpret_cast<char*>(pi);
    pi = reinterpret_cast<int*>(pc);
    pi = reinterpret_cast<int*>(i);
    //c = reinterpret_cast<char>(i); //Error
}
void dynamic_cast_demo()
{
    int i = 0;
    int* pi = &i;
    //char* pc = dynamic_cast<char*>(pi); //Error
}
int main()
{
    static_cast_demo();
    const_cast_demo();
    reinterpret_cast_demo();
    dynamic_cast_demo();
   
    return 0;
}

/*
k = 5
j = 5
x = 2
y = 8
&x = 0x7ffd82c92188
&y = 0x7ffd82c92188
*/

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69

小结
C方式的强制类型转换
过于粗暴
潜在的问题不易被发现
不易在代码中定位

新式类型转换以C++关键字的方式出现
编译器能够帮助检查潜在的问题
非常方便的在代码中定位

支持动态类型识别(dynamic_cast)

文章来源: allen5g.blog.csdn.net,作者:CodeAllen的博客,版权归原作者所有,如需转载,请联系作者。

原文链接:allen5g.blog.csdn.net/article/details/103582580

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。