在C语言中,类型转换有2种情况,分别是

  • 隐式类型转换:编译器在编译阶段自动进行,能转就转成功,不能则编译失败
  • 强制类型转换:需要用户自己处理

这种转换类型还是存在相关性的

C++的4种转换


static_cast``reinterpret_cast``const_cast``dynamic_cat为什么C++又自己引入了4种类型转换呢?
因为c风格的转换格式还是又缺点的

  1. 隐式类型转换可能会造成进度的缺失
  2. 显式类型转换将所有情况混在一起,代码不够清晰


static_cast

static_cast用于非多态类型的转换,其实和隐式类型转换差不多

float a = 1.2;
int b;
b = static_cast<int>(a);


reinterpret_cast

将一种类型转换为另一种不同的类型

double a = 13.14;
int b = static_cast<int>(a);
int* p = reinterpret_cast<int*>(b);


const_cast

最常用的用途就是删除变量的const属性,方便赋值

const int a = 1;
int* p = const_cast<int*>(&a);
*p = 2;

const_cast<>尖括号里面是指针或引用,其他类型不可以。


dynamic_cast

dynamic_cat用于将一个父类对象的指针或引用转换成子类对象的指针或引用

  • 向上转型:子类对象指针、引用给父类(本身就支持不需要转换)
  • 向下转型:父类对象指针、引用给子类(需要用dynamic_cast转换)

需要注意的是:

dynamic_cast只能用于父类包含虚函数的类,也就是说,父类没有虚函数就不能这么用 dynamic_cast会检查是否能转换成功,能成功则转换,不能成功,则返回0

class A
{
public:
	virtual void print()
	{}
};
class B:public A
{};
int main()
{
    A a;
    B* b = dynamic_cast<B*>(&a);
}

下面这样就会转换不成功,那么此时a就是空的引用:

B b;
A& a = dynamic_cast<A&>(b);