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<int> (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<B>(a);//编译不会报错,B类继承A类
    c=static_cast<B>(a);//编译报错,C类与A类没有任何关系
    return 1;
}

const_cast: const_cast 操作不能再不同的种类间转换。相反,它仅仅把一个他作用的本来是const类型的数据转换成const型的,或者把const属性去掉。
reinterpret_cast:有着和c风格的强制转换同样的能力。他可以转化任何内置的数据类型,也可以转化任何指针类型为其他的类型。他甚至可以转化内置的数据类型为指针,无须考虑类型安全或者异常量的情形。不到万不得已不要用。
dynamic_const :

  1. 其他三种都是编译完成是的,dynamic_cast是运行时处理的,运行时要进行类型检查。
  2. 不能用于内置的基本数据类型的强制转换。
  3. dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话返回NULL
  4. 使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不能通过。需要检测有虚函数的原因:类中存在虚函数,就说明有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义。由于运行时类型检查需要运行时类型的信息,而这个信息存储在类的虚函数表,只有定义了虚函数的类才有虚函数表。
  5. 在类的转换时,在类层次间进行上行转换时,dynamic_cast 和static_cast的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。向上转换即为指向子类对象的向下转换,即将父类指针转化子类指针。向下转换的成功与否还与将要转换的类型有关,即要转换的指针指向的对象的实际类型与转换以后的对象类型一定要相同,否则转换失败。

你可能感兴趣的:(C语言)