大家好,我是翼同学!


目录

  • 1️⃣前言
  • 2️⃣静态转换(static_cast)
  • ✨用法
  • ✔️语法
  • 🌱例子
  • 3️⃣动态转换(dynamic_cast)
  • ✨用法
  • ✔️语法
  • 🌱例子
  • 4️⃣写在最后

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;
}

运行结果如下:

staticresource 改变_c++

二、类层次结构中的类型转换

  • 这里就举例类继承中指针的互转
#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); //将派生类对象的类型转换为基类 
	
	//Base* test2 = static_cast<Base*>(a2);//错误的示范,必须有继承关系才能进行类型转换 
	
	return 0;
}

3️⃣动态转换(dynamic_cast)

✨用法

前面讲过,利用static_cast进行静态类型转换时,可以用于类层次结构中父类和子类之间指针或引用的转换。而dynamic_caststatic_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️⃣写在最后

好了,本篇笔记就到写这,欢迎大家到评论区一起讨论!