目录
C语言中的类型转换
隐式类型转换
强制类型转换
C++中的类型转换
static_cast
reinterpret_cast
const_cast
dynamic_cast
本期我们将学习C++中类型转换的相关知识点。
C语言中的类型转换
在C语言中,也有过类型转换的情景。
隐式类型转换
隐式类型转换其实也就是我们常说的相关类型的转换。
int main()
{int a = 10;double b = 20.1;b = a;return 0;
}
a和b都是表示大小的相关变量,所以可以支持隐式类型转换。
强制类型转换
强制类型转换其实就是不相关类型的转换。
int main()
{int a = 10;int* p = &a;a =(int)p;return 0;
}
a是变量,而p是变量的地址,所以两个变量是不相关的变量,就要进行强制类型转换。
C++中的类型转换
C++中的类型转换与C语言中的类型转换是一样的吗,其实C++中的类型转换就是对C语言中的类型转换的引申与拓展。
C++中有四种类型转为,为static_cast,reinterpret_cast,const_cast,dynamic_cast。
接下来,我们将详细的学习这四个类型。
static_cast
static_cast是隐式类型转换,支持相关类型的转换。
a和b是相关类型变量,所以支持隐式类型转换。
reinterpret_cast
reinterpret_cast是强制类型转换,支持不相关类型的转换。
a和p是不相关类型,所以只能进行强制类型转换。
const_cast
const_cast支持const类型转换为非const类型,可以方便进行赋值。但是模板位置只能存放指针或者引用。
我们在创建a变量时使用了volatile关键字,目的是为了禁止编译器做出优化,导致输出的a值与实际的a值不相同的情况。 a是const int类型,本来是不可以进行改变的,但是最终通过const_cast的转换,最终进行了改变。
dynamic_cast
dynamic支持继承中,父类对象和父类对象的地址传递给子类对象及子类对象的指针和子类对象的引用,也就是向下兼容。
class A
{virtual void func(){}
private:int _a;
};class B :public A
{
private:int _b;
};int main()
{//1.子类对象的指针可以传给父类对象的指针,向上兼容规则,天然支持A* a1=nullptr;B b1;a1 = &b1;//2.父类对象的指针可以传给子类对象的指针,使用dynamic_cast实现向下兼容A a2;B* b2 = nullptr;b2 = dynamic_cast<B*>(&a2);return 0;
}
再学习继承时,我们知道子类的对象和子类对象的地址是可以传递给父类的对象,父类对象的指针和父类对象的引用的,这是编译器天然支持的行为,但是相反父类是不能够传递给子类的,于是就有了dynamic_cast的类型转换,实现了向下兼容,但是前提是在父类中必须实现虚函数。
引用了dynamic_cast之后,虽然支持了父类向子类的向下兼容,但是实际上这种转换是没有什么太大的意义的,因为转换之后,子类的指针和引用或者单纯的子类对象都是是一个空值,进行不了任何的访问。 所以dynamic_cast一般情况下就适用于,继承中的子类对象向父类对象的转换。
为什么要引入四种类型转换?
- 期望C++程序员不要使用C语言中的隐式和强制类型转换,这样可以防止在项目中被类型转换而导致项目中一些不易被排查出来的bug的产生。
以上便是C++中类型转换的所有内容。
本期内容到此结束,至此,C++的所有内容已经更新完毕^_^