C++中的类型转换

本文介绍了C++中的四种类型转换:static_cast用于静态类型转换,dynamic_cast处理子类和父类之间的多态类型转换,const_cast用于去掉const属性,reinterpret_cast则涉及数据的二进制重新解释。每种转换都有其特定的应用场景,程序员应清楚转换前后的类型及可能后果。

一、概述

笔者曾经面试的时候遇到一个问题,在C++怎么改变const修饰的常量的值,当时我还想了一会,C语言的const修饰的常量是假常量,是可以通过指针修改的,而C++中的常量那可是一个真的常量,怎么修改呢!后来我想到了类型转换const_cast 去掉const属性转换。其实这道题我也不知道做对了没,回来也没有上网查过资料,借用一句话描述一下我这种性格吧,“不要和我比懒,我懒得和你比”。好了,废话不多说,让我们进入正题吧。我们都知道C语言的类型转换,其实C++中也有类型转换。C++提供了四种类型转换,分别适应不同的场合。

  • static_cast ——>静态类型转换。
  • reinterpreter_cast ——>重新解释类型转换。
  • dynamic_cast ——>子类和父类之间的多态类型转换。
  • const_cast ——>去掉const属性转换。

二、转换方式及相关案例

1、static_cast 静态类型转换

所谓的静态,即在编译期内即可决定其类型的转换,用的也是最多的一种
代码格式

static_cast<目标类型> cast

案例:

#include <iostream>
using namespace std;

int main()
{
    double dPi = 3.1415926;
    int iPi1 = (int)dPi;
    int iPi2 = dPi;

    int iPi3 = static_cast<int> (dPi);  

    cout << "dPi:" << dPi << "iPi1:" << iPi1 << "iPi2:" << iPi2 << "iPi3:" << iPi3 << endl;

    return 0; 
}
2、dynamic_cast 子类和父类之间的多态类型转换

形式

dynamic_cast<目标类型> (标识符)

案例:

#include <iostream>
using namespace std;

class Animal
{
public:
    virtual void cry() = 0;
    virtual void doWork() = 0;
};

class Cat : public Animal
{
public:
    virtual void cry()
    {
        cout << "喵喵~~~~" << endl;
    }
    virtual void doWork()
    {
        cout << "抓老鼠" << endl;
    }

};

class Dog :public Animal
{
public:
    virtual void cry()
    {
        cout << "汪汪~~" << endl;
    }
    virtual void doWork()
    {
        cout << "看家" << endl;
    }
};

int main(void)
{
    Animal *animal = NULL;
    animal = new Dog;
    animal->cry();
    animal->doWork();
    cout << " -----" << endl;
    Dog * dog = NULL;
    dog = dynamic_cast<Dog*>(animal); 
    if (dog != NULL)
    {
        cout << "转换成功" << endl;
        dog->cry();
        dog->doWork();
    }
    else 
    {
        cout << "转换失败" << endl;
    }
    Cat *cat = NULL;

    if (cat != NULL)
    {
        cout << "转换成功" << endl;
        cat->cry();
        cat->doWork();
    }
    else
    {
        cout << "转换失败" << endl;
    }
    delete animal;
    return 0;
}
3、const_cast 去掉const属性转换

目标类类型只能是指针或引用
形式:

const_cast<目标类型> (标识符)

案例:

const int a = 10; 
const int *a_p = &a; 
//把a_p的const 属性去掉
int *a_p1 = const_cast<int*>(a_p);
4、reinterpret_cast 重新解释类型转换

interpret 是解释的意思,reinterpret 即为重新解释,此标识符的意思即为数据的二进制形式重新解释,但是不改变其值。
形式:

reinterpret_cast<目标类型> (标识符)

案例:

#include <iostream>

using namespace std;

class Animal
{
public:
    virtual void cry() = 0;
    virtual void doWork() = 0;
};

class Cat : public Animal
{
public:
    virtual void cry()
    {
        cout << "喵喵~~~~" << endl;
    }
    virtual void doWork()
    {
        cout << "抓老鼠" << endl;
    }

};

class Dog :public Animal
{
public:
    virtual void cry()
    {
        cout << "汪汪~~" << endl;
    }
    virtual void doWork()
    {
        cout << "看家" << endl;
    }
};

class Tree
{
public:
    Tree(int age)
    {
        this->age = age;
    }
    virtual void print()
    {
        cout << "我是大叔" << endl;
    }
    int age;
};


int main(void)
{
    Animal *animal = new Dog;
    //是c++中真正的 强制转换, 也是最危险的转换方式。
    Tree* tree = reinterpret_cast<Tree*>(animal); 
    if (tree != NULL)
    {
        cout << "转换成功" << endl;
        cout << tree->age << endl;
        tree->print();
    }
    else
    {
        cout << "转换失败" << endl;
    }
    return 0;
}

三、总结

程序员要清除的知道: 要转的变量,类型转换前是什么类型,类型转换后是什么类型。转换后有什么后果。一般情况下,不建议进行类型转换。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

The_Web3_社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值