C++四种类型转换方式

C++四种类型转换方式

  • reinterpret_cast(expression)
  • dynamic_cast(expression)
  • static_cast(expression)
  • const_cast(expresson>

1.reinterpret_cast

reinterpert_cast意图执行低级转换,实际动作(及结果)可能取决于编译器,这也就表示它不可移植。例如将一个 pointer to int 转型为一个 int ,这一类型在底层代码以外很少见。

示例:

class A{};
class B{};

A *a = new A;
B *b = reinterpret(a);
//reinterpret_cast就像传统的类型转换一样对待所有指针的类型转换

2.static_cast

  • static_cast用来强迫隐式转换,允许执行任意的隐式转换和相反转换动作
  • 可将 non-const对象转为const对象,将int转为double,将void*指针转为typed指针,将pointer-to-base转为pointer-to-derived
  • 无法将const转为non-const,这个只有const-cast才可办到

示例:

class Base{};
class Derived:public Base{};

Base* a = new Base;
Derived* b = static_cast(a);//把父类指针转换为子类指针
  • static_cast除了操作类型指针,也能用于执行类型定义的显式的转换,以及基础类型之间的标准转换;
double d = 3.14159265;
int i = static_cast<int>(d);

3.dynamic_cast

  • dynamic_cast 只用于对象的指针和引用。
  • 主要用于执行“安全向下转型(safe downcasting)”,也就是用来决定某对象是否归属继承体系中的某个类型。它是唯一不能由旧式语法执行的动作,也是唯一可能耗费重大运行成本的转型动作
  • 当用于多态类型时,它允许任意的隐式类型转换以及相反过程。
  • 不过,与static_cast不同的是在隐式转换的相反过程中,dynamic_cast会检查操作是否有效,它会检查转换是否会返回一个被请求的有效的完整对象。检查在运行时进行,如果被转换的指针不是一个被请求的有效完整的对象指针,返回值为NULL;

示例:

class Base{
public:
    virtual dummy(){}
};
class Derived:public Base{};

Base* b1 = new Derived;
Base* b2 = new Base;

Derived* d1 = dynamic_cast(b1);//成功
Deriver* d2 = dynamic_cast(b2);//失败,返回NULL

4.const_cast

  • 通常被用来将对象的常量性移除,它也是唯一有此能力的C++-style转型操作符

示例

class C{};

const C* a = new C;

C* b = const_cast(a);

5.总结

  • 去const属性用const_cast;
  • 基本类型转换用static_cast;
  • 多态类之间的类型转换用dynamic_cast;
  • 不同类型的指针类型转换用reinterpret_cast;

你可能感兴趣的:(c++)