答案:A、C。
转换指的是通过改变一个变量的类型为别的类型从而改变该变量的表示方式。
C++标准定义了四个新的转换符:reinterpret_cast、static_cast、dynamic_cast和const_cast,
目的在于控制类(class)之间的类型转换。
对于选项A,static_cast可以用于类层次结构中基类和子类之间指针或引用的转换。
把子类的指针或引用转换成基类表示是安全的,但把基类指针或引用转换成子类指针或引用时,由于没有动态类型检查,所以,它是不安全的。
基类和子类之间的动态类型转换一般建议使用dynamic_cast。
static_cast可以用作对象继承之间转换,只不过有安全隐患。因此,选项A正确。
对于选项B,reinterpret_cast用来处理无关类型之间的转换,可以转换任意一个32位整数,
包括所有的指针和整数。可以把任何整数转成指针,也可以把任何指针转成整数,
以及把指针转化为任意类型的指针,但不能将非32位的实例转成指针。所以,选项B错误。
对于选项C,dynamic_cast用于对象的指针和引用,当用于多态类型转换时,
允许隐式转换及相反的转换操作,与static_cast的不同之处在于,在相反的转换过程中,
dynamic_cast会检测操作的有效性,如果返回的不是被请求的有效完整对象,则返回null,
反之返回这个有效的对象,如果是引用返回无效时,则会抛出bad_cast异常。所以,选项C正确。
对于选项D,const_cast用来修改类型的const或volatile属性,具体而言,
const_cast会操纵传递对象的const属性,设置或者移除该属性。所以,选项D错误。
所以,本题的答案为A、C。
C++的四种强制类型转换
C++的四种强制类型转换,所以C++不是类型安全的。分别为:static_cast , dynamic_cast , const_cast , reinterpret_cast
为什么使用C风格的强制转换可以把想要的任何东西转换成合乎心意的类型。那为什么还需要一个新的C++类型的强制转换呢?
新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换。C++中风格是static_cast(content)。C++风格的强制转换其他的好处是,它们能更清晰的表明它们要干什么。程序员只要扫一眼这样的代码,就能立即知道一个强制转换的目的。
四种转换的区别:
static_cast:可以实现C++中内置基本数据类型之间的相互转换。
int c=static_cast(7.987);
如果涉及到类的话,static_cast只能在具有相互联系的类中进行转换,不一定包含虚函数。
class A
{};
class B:public A
{};
class C
{};
int main()
{
A* a=new A;
B* b;
C* c;
b=static_cast(a); // 编译不会报错, B类继承A类
c=static_cast(a); // 编译报错, C类与A类没有任何关系
return 1;
}
const_cast: const_cast操作不能在不同的种类间转换。相反,它仅仅把一个它作用的表达式转换成常量。它可以使一个本来不是const类型的数据转换成const类型的,或者把const属性去掉。
reinterpret_cast: 有着和C风格的强制转换同样的能力。它可以转化任何内置的数据类型为其他任何的数据类型,也可以转化任何指针类型为其他的类型。它甚至可以转化内置的数据类型为指针,无须考虑类型安全或者常量的情形。不到万不得已绝对不用。
dynamic_cast:
(1)其他三种都是编译时完成的,dynamic_cast是运行时处理的,运行时要进行类型检查。
(2)不能用于内置的基本数据类型的强制转换。
(3)dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。
(4)使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。