C++进阶 | 类型转换

C风格的强制类型转换
Type b=(Type) a

c 风格的类型转换有不少的缺点,有的时候用 c 风格 的转换是不合 适的,因为它可以在任意类型之间转换,比如你可以把一个指向 const 对象的指针转换 成指向非 const 对象的指针,把一个指向基类对象的指针 转换成指向一个派生类对象的 指针,这两种转换之间的差别是巨大的,但是传统 的 c 语言风格的类型转换没有区分这 些。还有一个缺点就是,c 风格的转换不容 易查找,他由一个括号加上一个标识符组成, 而这样的东西在 c++程序里一大 堆。所以 c++为了克服这些缺点,引进了 4 新的类型转换操作符。

c++提供了4种类型转换,分别处理不同的场合应用
static_cast 静态类型转换
reinterpreter_cast 重新解释类型转换
dynamic_cast 子类和父类之间的多态类型转换
const_cast 去掉const属性转换

静态类型转换static_cast

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

只适合基础数据类型转换和转换具有继承关系的对象指针或引用

如 int a=1; char b=static_cast<char> (a);

转换具有继承关系的对象指针或引用:父类指针(引用)转子类指针(引用)或子类指针(引用)转父类指针(引用)都可以。
Animal * ani=NULL;
Cat* cat=static_cast<Cat*>(ani);

Cat* soncat=NULL;
Animal* anifather=static_<Aniaml*>(soncat);

Cat catobj;
Cat& catref=catobj;
Animal& anifather=static_cast<Animal&>(catref);

dynamic_cast 子类和父类之间的多态类型转换

只能转换具有继承关系的指针或者引用,在转换前会对象类型进行安全检查。
也就是说只能子类指针转父类指针。
父类指针转子类指针不安全,会报错。

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

Cat* soncat=NULL;
Animal* anifather=static_<Aniaml*>(soncat);

Cat catobj;
Cat& catref=catobj;
Animal& anifather=static_cast<Animal&>(catref);

const_cast 去掉const属性转换

针对指针、引用、对象指针
等号左边一定要是指针或引用

#include <iostream>
using namespace std;

struct A {
    int data;
};
int main(void)
{
    
    A a = {200};
    //A a1 = const_cast<A>(a);
    a=static_cast<const A> (a);  
    
    
    const A& c=a;
    A &a2 = const_cast<A&>(a); //减去const
    a2.data = 400;
    cout<<a.data<<a2.data<<endl;
    A *a3 = const_cast<A*>(&a);
    a3->data = 500;
    cout<<a.data<<a3->data<<endl;
    A b={100};       //增加const
    const A &a4 = const_cast<const A&>(b);
    
    const int x = 3;
    int &x1 = const_cast<int&>(x);
    x1 = 300;
    cout<<x<<x1<<endl;
    int *x2 = const_cast<int*>(&x);
    *x2 = 400;
    cout<<x<<*x2<<endl;
return 0; }

reinterpret_cast 强制类型转换

无关的指针类型,包括函数指针都可以进行转换。

如:typedef void(FUN1) (int,int);
typedef int(
FUN2)(int,char*);

FUNC1 func1;
FUNC2 func2=reinterpret_cast<FUNC2> (func1);

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值