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;
运行结果如下:
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️⃣写在最后
好了,本篇笔记就到写这,欢迎大家到评论区一起讨论!