C++中的类型转化:static_cast

当编译出现如下的错误的时候:

  • error: invalid conversion from ‘int*’ to ‘char*’
  • error: cannot initialize a variable of type ‘const int’ with an rvalue of type ‘int’

我们就要思考如何正确的进行类型转化了。

static_cast基本用法

该转化对应于c语言中的类型转化,用于非多态类型之间的转换,不提供运行时的检查来确保转换的安全性。

  1. 基本数据类型转换
  2. int转换成enum
  3. 基类和子类之间指针和引用的转换

1. 基本数据类型转化

在基本类型的转化中,c语言的转换方式依旧是可以适用的,但为了类型转化更加醒目,我们通常使用这种static_cast的类型转化。

转化格式为static_cast<转化后的类型>(转化的变量名),

    int* n = NULL;
    void* p = n;  // c语言中的隐式转化
    n = (int*)p;  // c语言中的显示转化
    n = static_cast<int*>(p);   // c++中的类型转化

2. int转换成enum

和基本类型转化很相似,直接看转化的代码吧。

enum Week{
   SUN,MON,TUE,WED,THU,FRI,SAT
};
Week day = static_cast<Week>(0);

3. 基类和子类之间指针和引用的转换

我们可以将基类和子类之间指针和引用的转换分为两种

  • 上行转化:把子类的指针或引用转换成父类,这种转换是安全的(通常使用默认转换)
  • 下行转化:把父类的指针或引用转换成子类,这种转换是不安全的,也需要程序员来保证(通常使用dynamic_cast)

相关代码如下:

class Base{
public:
    virtual void Test(){  // virtual 多态
        cout << "Base:" <<  __func__ << endl;
    }
};
class Derive:public Base{
public:
    void Test(){
        cout << "Derive:" <<  __func__ << endl;
    }

    void Func(){
        cout << "Derive:" <<  __func__ << endl;
    }
};

int main(){
    Derive d;
    Base b = static_cast<Base>(d);  // 也可以进行隐式转换:Base b = d;
    b.Print();

    // 引用
    Base& fb = static_cast<Base&>(d);  // 也可以进行隐式转换:Base& fb = d;
    fb.Print();

    // 指针
    Base* pb = static_cast<Base*>(new Derive); // 也可以进行隐式转换:Base* pb = new Derive;
    pb->Print();
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值