在C++中,下列哪一个可以做为对象继承之间的转换: (答案是AB /B?)
A.static_cast
B.dynamic_cast
C.const_cast
D.reinterpret_cast
C++标准定义了四个新的转换符:
reinterpret_cast
、
static_cast
、
dynamic_cast
和
const_cast
,
目的在于控制类(
class
)之间的类型转换。
对于选项A,
static_cast
可以用于类层次结构中基类和子类之间指针或引用的转换。
把子类的指针或引用转换成基类表示是安全的,但把基类指针或引用转换成子类指针或引用时,
由于没有动态类型检查,所以,它是不安全的。
基类和子类之间的动态类型转换一般建议使用
dynamic_cast
。
static_cast
可以用作对象继承之间转换,只不过有安全隐患。因此,选项A正确。
对于选项B,
dynamic_cast
用于对象的指针和引用,当用于多态类型转换时,
允许隐式转换及相反的转换操作,与
static_cast
的不同之处在于,在相反的转换过程中,
dynamic_cast
会检测操作的有效性,如果返回的不是被请求的有效完整对象,则返回null,
反之返回这个有效的对象,如果是引用返回无效时,则会抛出bad_cast异常。所以,选项B正确。
对于选项C,
const_cast
用来修改类型的
const
或
volatile
属性,具体而言,
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* 的强制变换、隐式类型变换和类层次的静态定位