大家好,我是翼同学!
1??前言
这篇笔记的内容是:静态类型转换与动态类型转换
在之前我们学过,变量的数据类型可以强制转换为其他数据类型。但由于这种C风格的类型转换可能会出现一些问题,即过于松散的情况,因此C++提出了更加规范、严格的类型转换,添加了四个类型转换运算符,进而更好的控制类型转换过程。
类型转换符:
static_cast dynamic_cast const_cast reinterpret_cast
因此,我们可以根据自身的目的选择合适的运算符,进行类型转换,也能让编译器能检查程序的行为是否和正常的逻辑相吻合。
2??静态转换(static_cast)
?用法
静态转换可以用两种用法:
一是基本数据类型的转换(如将int类型转换为char类型)
二是静态转换用于类层次结构中父类和子类之间指针或引用的转换。(有继承关系的)
需要注意,这里有两个概念需要理清楚:
- 上行转换:将子类的指针或引用转换成父类表示,这是安全可行的。
- 下行转换:但是将父类的指针或引用转换成子类表示时,就是不安全的(如果没有动态类型检查的话)
??语法
static_cast <要转换的类型>(变量名或表达式)
🌱例子
一、基本数据类型转换的例子
#include <iostream>
using namespace std;
int main()
{
int test = 97;
char ch = static_cast <char> (test);
cout<<"ch的值为"<<ch;
return 0;
}
运行结果如下:
二、类层次结构中的类型转换
#include <iostream>
using namespace std;
class Base{
};
class Derive : public Base{
};
class Other{
};
int main()
{
Base* a = 0;
Derive* a1 = 0;
Other* a2 = 0;
Base* test1 = static_cast<Base*>(a1);
return 0;
}
3??动态转换(dynamic_cast)
?用法
前面讲过,利用static_cast 进行静态类型转换时,可以用于类层次结构中父类和子类之间指针或引用的转换。而dynamic_cast 和static_cast 的语法基本相同。 而使用dynamic_cast 的好处在于,当想要将父类的指针或引用转换成子类表示时,dynamic_cast 具有类型检查的功能,这使其比static_cast 更加安全。
因此,总的来说,动态类型转换dynamic_cast 经常使用在多态场景下,基类和派生类的相互转换,并且比static_cast 更为安全。并且,动态转换不支持基本数据类型转换,必须是指向完整的类类型的指针或引用。而且我们可以通过判断转换后的指针值是否为NULL判断是否转换成功。
??语法
dynamic_cast<要转换的类型>(变量名或表达式)
🌱例子
#include <iostream>
using namespace std;
class Base{
virtual void printf();
};
class Derive : public Base{
void printf(){
cout<<"hello"<<endl;
}
};
int main()
{
Base* a = 0;
Derive* a1 = 0;
Base* test1 = dynamic_cast<Base*>(a1);
Derive* test2 = dynamic_cast<Derive*>(a);
return 0;
}
4??写在最后
好了,本篇笔记就到写这,欢迎大家到评论区一起讨论!
|