本网站(662p.com)打包出售,且带程序代码数据,662p.com域名,程序内核采用TP框架开发,需要联系扣扣:2360248666 /wx:lianweikj
精品域名一口价出售:1y1m.com(350元) ,6b7b.com(400元) , 5k5j.com(380元) , yayj.com(1800元), jiongzhun.com(1000元) , niuzen.com(2800元) , zennei.com(5000元)
需要联系扣扣:2360248666 /wx:lianweikj
一文带你深入了解C++中的类型转换
mylove136 · 97浏览 · 发布于2022-12-27 +关注

在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化。本文主要介绍了C++中常见的四个类型转换,需要的可以参考一下

C语言中的类型转换

在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换。

1.隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败

2.显式类型转化:需要用户自己处理

3.缺陷:转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换

int main()
{
    int i = 1;
    // 隐式类型转换(意义相近的类型)
    double d = i;
    printf("%d, %.2f\n", i, d);
 
    int* p = &i;
    // 显示的强制类型转换(意义不相近的类型,值转换后有意义)
    int address = (int)p;
 
    printf("%x, %d\n", p, address);
 
    return 0;
}

为什么C++需要四种类型转换

C风格的转换格式很简单,但是有不少缺点的:

1.隐式类型转化有些情况下可能会出问题:比如数据精度丢失

2.显式类型转换将所有情况混合在一起,代码不够清晰

因此C++提出了自己的类型转化风格,注意因为C++要兼容C语言,所以C++中还可以使用C语言的转化风格。

C++强制类型转换

标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:

static_cast、 reinterpret_cast、 const_cast、 dynamic_cast

static_cast

static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用static_cast,但它不能用于两个不相关的类型进行转换

int main()
{
    double d = 12.34;
    int a = static_cast<int>(d); // 意义相近的
    cout << a << endl;
     int* p = &a;
    // 不支持的
    //int address = static_cast<int>(p); // 意义不相近
    return 0;
}

reinterpret_cast

reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型

int main()
{
    double d = 12.34;
    int a = static_cast<int>(d); // 意义相近
    cout << a << endl;
     int* p = &a;
    // 不支持的
    //int address = static_cast<int>(p);
    int address = reinterpret_cast<int>(p); // 意义不相近
    return 0;
}

const_cast

const_cast最常用的用途就是删除变量的const属性,方便赋值

int main()
{
    // const int a = 2;
    volatile const int a = 2;
    int* p = const_cast<int*>(&a);
    //int* p = (int*)&a;
     *p = 3;
     cout << a << endl;  // 2
    cout << *p << endl; // 3
      return 0;
}


image.png

dynamic_cast

image.png

class A
{
public:
    virtual void f(){}
public:
    int _a = 0;
};
 class B : public A
{
public:
    int _b = 1;
};
 // A*指针pa有可能指向父类,有可能指向子类
void fun(A* pa)
{
    // 如果pa是指向子类,那么可以转换,转换表达式返回正确的地址
    // 如果pa是指向父类,那么不能转换,转换表达式返回nullptr
    B* pb = dynamic_cast<B*>(pa); // 安全的
    //B* pb = (B*)pa;             // 不安全
    if (pb)
    {
        cout << "转换成功" << endl;
        pb->_a++;
        pb->_b++;
        cout << pb->_a << ":" << pb->_b << endl;
    }
    else
    {
        cout << "转换失败" << endl;
        pa->_a++;
        cout << pa->_a << endl;
    }
}
// A 是父类   B是子类
int main()
{
    // 父类对象无论如何都是不允许转换成子类对象的
    // A aa;
    // B bb = dynamic_cast<B>(aa); // 不支持
    // B bb = (B)aa;               // 不支持
     A aa;
    B bb;
    A* pa = &bb;
     B* pb = dynamic_cast<B*>(pa);
     //fun(nullptr);
    return 0;
}

image.png

class A1
{
public:
    virtual void f(){}
public:
    int _a1 = 0;
};
 class A2
{
public:
    virtual void f(){}
public:
    int _a2 = 0;
};
 class B : public A1, public A2
{
public:
    int _b = 1;
};
 int main()
{
    B bb;
    A1* ptr1 = &bb;
    A2* ptr2 = &bb;
    cout << ptr1 << endl;
    cout << ptr2 << endl << endl;
          B* pb1 = (B*)ptr1;
    B* pb2 = (B*)ptr2;
    cout << pb1 << endl;
    cout << pb2 << endl << endl;
     B* pb3 = dynamic_cast<B*>(ptr1);
    B* pb4 = dynamic_cast<B*>(ptr2);
    cout << pb3 << endl;
    cout << pb4 << endl << endl;
     return 0;
}


c++

相关推荐

PHP实现部分字符隐藏

沙雕mars · 1322浏览 · 2019-04-28 09:47:56
Java中ArrayList和LinkedList区别

kenrry1992 · 906浏览 · 2019-05-08 21:14:54
Tomcat 下载及安装配置

manongba · 966浏览 · 2019-05-13 21:03:56
JAVA变量介绍

manongba · 960浏览 · 2019-05-13 21:05:52
什么是SpringBoot

iamitnan · 1084浏览 · 2019-05-14 22:20:36
加载中

0评论

评论
分类专栏
小鸟云服务器
扫码进入手机网页