C++转换符(类之间的类型转换) 持续更新

在C++中,下列哪一个可以做为对象继承之间的转换: (答案是AB /B?)

A.static_cast
B.dynamic_cast
C.const_cast
D.reinterpret_cast

C++标准定义了四个新的转换符:reinterpret_caststatic_castdynamic_castconst_cast

目的在于控制类(class)之间的类型转换。

对于选项A,static_cast可以用于类层次结构中基类和子类之间指针或引用的转换。

把子类的指针或引用转换成基类表示是安全的,但把基类指针或引用转换成子类指针或引用时,

由于没有动态类型检查,所以,它是不安全的。基类和子类之间的动态类型转换一般建议使用dynamic_cast

static_cast可以用作对象继承之间转换,只不过有安全隐患。因此,选项A正确。

 

对于选项B,dynamic_cast用于对象的指针和引用,当用于多态类型转换时,

允许隐式转换及相反的转换操作,与static_cast的不同之处在于,在相反的转换过程中,

dynamic_cast会检测操作的有效性,如果返回的不是被请求的有效完整对象,则返回null,

反之返回这个有效的对象,如果是引用返回无效时,则会抛出bad_cast异常。所以,选项B正确。

对于选项C,const_cast用来修改类型的constvolatile属性,具体而言,

const_cast会操纵传递对象的const属性,设置或者移除该属性。所以,选项C错误。

对于选项D,reinterpret_cast用来处理无关类型之间的转换,可以转换任意一个32位整数,

包括所有的指针和整数。可以把任何整数转成指针,也可以把任何指针转成整数,

以及把指针转化为任意类型的指针,但不能将非32位的实例转成指针。所以,选项D错误。

所以,本题的答案为A、B。

简单总结

dynamic_cast : 

继承体系安全向下转型或跨系转型;找出某对象占用内存的起始点

static_cast:

同旧式C转型,如int 到double

const_cast:

常用于去除某个对象的常量性

reinterpret_cast

不具备移植性,常见用途是转化函数指针类型

 

转换运算符

   转换(cast)这个词通常意为“浇铸成一个模型”。如果编译器能够明白的话,它会自动把一种数据类型转换为另一种类型。例如,如果赋一个整型值给一个浮点变量,编译器会暗地里调用一个函数(或更可能插入代码)来把整型值转换为浮点型。转换允许使用这种显式类型转换,或在转换没有正常情况下发生时强制它实现。

   为了实现转换,要用括号把所想转换的数据类型(包括所有的修饰符)括起来放在值得左边。这个值可以是一个变量、一个常量、由一个表达式产生的值或是一个函数的返回值。

   C++有一个另外的转换语法,他遵从函数调用的语法。这个语法给参数加上括号而不是给数据类型加上括号,类似于函数调用:

int main(){

float a=float(200);//和下面相等

float b=(float)200;

}

C++的显式转换

  应该小心使用转换,因为转换实际上要做的就是对编译器说“忘记类型检查,把它看成是其他类型。”这也就是说,在C++类型系统中引入了一个漏洞,并阻止编译器报告在类型方面出错了。更为糟糕的是,编译器会相信他,而不执行任何其他的检查来捕获错误。一旦开始进行转换,程序员必须自己面对各种问题。事实上,无论什么原因,任何一个程序如果使用很多转换都值得怀疑。一般情况下很少使用转换,他只是用于解决非常特殊的问题。

   一旦理解了这一点,在遇到一个出故障的程序时,第一个反应应该是寻找作为嫌犯的转换。但是怎么确定C风格的转换位置呢?他们只是在括号中的类型名字,如果开始查找这些的话,我们会发现很难把他们和代码的其他部分呢区分开。

  标准C++包括一个显式的转换语法,使用它来完全代替旧的C风格的转换(当然,如果不破坏代码,是不会认为C风格的转换不合法,但是编译器的编写者很容易标出旧风格的转换)。显示类型转化语法是我嗯很容易发现他们,因为通过他们的名字就能找到:

static_cast :用于“良性”和“适度良性”转换,包括不用强制转换(例如自动类型转换)

const_cast:对“const”和/或“volatile”进行转换。

reinterpret_cast:转换为完全不同的意思。为了安全使用它,关键必须转换回原来的类型。转换成的类型一般只能用于位操作,否则就是为了其他隐秘的目的。这就是所有类型换中最危险的。

dynamic_cast:用于类型安全的向下转换

静态转换(static_cast)

  static_cast全部用于明确定义的变换,包括编译器准许我们所做的不用强制转换的“安全”变换和不太安全但清楚定义的变换。static_cast包含的转换类型包括典型的非强制变换、窄化(有信息丢失)变换,使用void* 的强制变换、隐式类型变换和类层次的静态定位

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值