C++类型转换操作符

在C语言中其实已有类型转换,比如强制类型转换,形式上是

(type) expression

 对标C中的强制类型转换,C++中按照类型转换的意图对他们进行了分类,形式上是

static_cast <type> (expression)

static_cast可以理解成一种转换意图的说明,与其相关的操作符还有以下几个

bf2c55e53eb64d76a2448adc415e2fbe.png

1、 static_cast:实现基本数据类型的转换

基本数据类型转换在C语言中直接就是强制转换了,就比如像这样

double a = 1.0;
int b = (int)a;

但在C++中此种转换,可借助static_cast,写法是

double a = 1.0;
int a = static_cast <int> a;

2、dynamic_cast:主要用于对象指针(或引用)安全的向下转型(涉及继承时使用)

大致有下面这几种情况,这几种情况所描述的背景是,Base是一个父类,Derived是一个子类,继承了父类Base,其他具体看程序,

情况①

Base *base ;
Derived *der = new Derived;
base = dynamic_cast<Base*>(der); //正确,但不必要。

69e095f0ff6249fab1f8d39d9c9d3241.png

针对指针来说,这是一种向上转型(儿子向父亲转,往上嘛),向上转型是一定能成功的,并且不加dynamic_cast,因为其本身就是安全的,子类与父类相比,所包含的东西一定是大于等于父类,所以多的往少的转肯定是可以成功的。

情况② 

Base* base = new Derived;
Derived *der= dynamic_cast<Derived*>(base);

6e2247e8ce9b42bbac11bc0bb5262d9e.png

针对指针来说,这是一种向下转型(父亲向儿子转,往下嘛),但是由于父类指针指向的是一个子类对象,咱就是说,虽然指针的级别不够,但是其实实在在有子类的东西,子类的东西属于多的那方,所以其往子类指针转,仍是安全可行的。

情况③ 

 Base * base = new Base;
 Derived *der = dynamic_cast<Derived*>(base)

62bfd6aa3b5e4660a0057e4a65dec28a.png

这也是一种向下转型,但是其实实在在的内容只有父类对象那么多,是属于少的那一方,他却想要去转变成子类的指针,万一子类指针想去访问一下自己子类中的独有成员(而非父类继承来的),那不就寄了,这根本没有啊,实际有的只有父类的东西,所以说这种转型是一种不安全的转型。

3、const_cast:改变某物的常量性(constness)或变易性(volatileness) ,一般可以用于去除某个量的常量性,当然也可以是增加常量性。

4、reinterpret_cast:不需要有继承关系,将一种指针类型转换成另一种指针类型,往往用于不同类型的函数指针转换。但是这种转换是一种不具有可移植性的转换,不同的编译器可能会有不同,所以除非万不得已,否则别用。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

翔在天上飞

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

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

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

打赏作者

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

抵扣说明:

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

余额充值