强制类型转换

强制类型转换

以前学过关于类型转换的方法,今天用了几个类,自己做了一下。
普通类型转换:int(x) (int)x 如果A是一个类应该只能用(A)x,不能区分风险的高低

1. static_cast

static_cast用来进行比较自然和低风险的转换,比如整型和实数型,字符型之间的转换

static_cast不能用来在不同类型的指针之间互相转换,也不能用于整型和指针之间的互相转换,也不能用于不同类型的引用之间的转换

class A{
public:
    operator int()   {return 1;}  //类型转换运算符重载不用写返回值类型
    operator char*() {return NULL;}
}

int a;
a=static_cast<int>(3.14);

char*p="acd";
p=static_cast<char*>(a);

2. reinterpret_cast

reinterpret_cast用来进行各种不同类型的指针之间的转换,不同类型的引用之间的转换,以及指针和能容纳得下指针的整数类型的转换。转换的时候执行的是逐个比特拷贝的操作。

#include <iostream>
class A
{
public:
    int i;
    int j;
    A(int n):i(n),j(n){}
};
int main(){
    A a(100);
    int & r=reinterpret_cast<int&>(a);
    r=200;     //这时a.i=200,a.j=100;
    int n=300;
    A* pa=reinterpret_cast<A*>(&n);   //强行让pa指向n
    pa->i=400;  //将n变为400
    pa->j=500;  //这能导致出错
}

3. const_cast

用来进行去除const属性的转换,将const引用转换成同类型的非const引用,将const指针转换为同类型的非const指针

const string s="Inception";
string & p=const_cast<string&>(s);
string * ps=const_cast<string*>(&s);  //能用p和指针修改s的内容

4. dynamic_cast

dynamic_cast专门用于将多态基类的指针或引用,强制转换为派生类的指针或引用,而且能检查转换的安全性。对于不安全的指针转换,转换结果返回NULL指针,如果是不安全的引用转换抛出bad_cast异常。

dynamic_cast不能用于将非多态基类的指针或引用,强制转换为派生类的指针或引用

如果该基类指针真的指向派生类对象,转化就是安全的

class Base{
public:
    virtual ~Base(){}
};
class Derived:public Base{};
int main(){
    Base b;
    Derived d;
    Derived *pd;
    pd=reinterpret_cast<Derived*>(&b);  //这没办法判断安全性,一定成功
    pd=dynamic_cast<Derived*>(&b);   //这为NULL
    
    Derived & r =dynamic_cast<Derived&>(b);  //能通过抛出异常判断安全
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值